我的c++学习(9)指针

◆ 1、指针变量的赋值、初始化与简单应用

复制代码
 int x=5,y;
     y=15; // y可以理解成该存储单元的当前名字
     int *ip; // ip是一个指针(变量)
     ip=&y; // ip是存储空间y的地址
     

     cout<<*ip<<'\n'; //结果15
     cout<<ip<<'\n';  //结果001BFC0C
     cout<<&y<<'\n';  //结果001BFC0C
     cout<<y<<'\n';;  //结果15
     cout<<x;         //结果5
复制代码

//int age1=18, age2=20, *p_age; // p_age=&age1; // cout<<"age of wang ping is"<<*p_age<<endl; //18 // p_age=&age2; // cout<<"age of zhang ling is"<<*p_age<<endl; //20

 ◆ 2、指针变量初始化
 例如: int age , *p_age=&age; //p_age初始化为指向整型量age。
 
任何类型指针都可以赋以0值(NULL),称空指针,表示该指针不指向该类型的任何一个变量(对象)。注意不是指向地址为0的内存空间。
 
常量是不可寻址的,但常变量是可寻址的,如:
     p_age=&20; //错误
     const float PI=3.14159;
     float *pointer=&PI; //正确

 

 ◆ 3、指针使用时注意 •指针类型可以强制转换,有特殊应用,例如:
    int m, *pm=&m;
     char *p1=(char*)&m, *p2=(char*)pm;
用pm读的是整型数,用p1,p2读的是整型数的第一个字节。
•同类型的指针可以相互赋值,如有说明:
    int val1=18, val2=20, *p_val1=&val1, *p_val2=&val2;
     // p_val1指向val1,p_val2指向val2
执行 p_val1=p_val2; 后,则p_val1也指向val2,而没有指针指向val1了。(查看动画演示)
•必须谨慎使用指针,一旦使用不当会产生灾难性的后果。
 例如,局部指针变量在定义时其中的值为随机数,即指针指向了一个无意义的地址,也可能偶然指向了一个非常重要数据的地址。如果对所指的内存进行不当操作,其中的数据就丢失了。
 再如,全局指针变量,原指向一个局部变量,后来该内存又重新分配了,我们再对该指针所指地址进行操作,同样会发生不可预知的错误。
•对指针变量决不可以任意赋一个内存地址,结果甚至是灾难性的。如:
    int *P=(int *)0xaf80;
把指针变量P的初始置为0xaf80,我们并不知道那个内存单元放的是什么数据,这在一般程序中是非常危险的。
• 如果通过指向对象或结构变量的指针变量来访问其公有成员时,则只要在指针变量名后加箭头号(箭头操作符“->”),再加公有成员名就可以了。

复制代码
#include "stdafx.h"
using namespace std;
#include<iostream>
#include<cstring>
using namespace std;

 struct student{
     char name[20];
     char id[10];//学号最好用字符串,当学号以0开头,整数会丢失0甚至认为是八进制
    int age;
     float score;
     char address[30];
 };
 int main(){
     student st1,*prst;
     prst=&st1;
     cout<<"请输入学生的姓名:"<<endl;
     cin.getline(st1.name,20);//cin.getline可输入空格
     cout<<"请输入学号、年龄和入学成绩:"<<endl;
     cin>>st1.id>>st1.age>>st1.score;
     cin.get();//吸收掉换行回车符
     cout<<"请输入家庭住址:"<<endl;
     cin.getline(st1.address,30);
     cout<<"姓名"<<'\t'<<prst->name<<'\n';
     cout<<"学号"<<'\t'<<prst->id<<'\n';
     cout<<"年龄"<<'\t'<<prst->age<<'\n';
     cout<<"入学成绩"<<'\t'<<prst->score<<'\n';
     cout<<"家庭住址"<<'\t'<<prst->address<<endl;
     return 0;
 }
复制代码


 指针常量是固定指向一个对象的指针,即指针本身是常量:
    char ch=’a’,ch1=’x’;
     char * const ptr=&ch; //注意const放在类型说明之后,变量名之前
    *ptr=’b’;//正确
    ptr=&ch1;//错误
ptr本身在初始化时所指向的地址是不可改变的,但它指向的目标ch的值是可以改变的。
•常量指针是指向“常量”的指针,即指针本身可以改指向别的对象,但不能通过该指针修改对象。该对象可以通过其他方式修改,常用于函数的参数,以免误改了实参。类似于在“运算符重载”一节中引用参数前加const。
    char ch=’a’,ch1=’x’;
     const char * ptr1=&ch; //ptr1是常量指针
    *ptr1=’b’; //错误,只能做ch=’b’
    ptr1=&ch1; //正确

posted @   哪啊哪啊神去村  阅读(398)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示