1、引言
笔者认为对于学习指针要弄清楚如下问题基本可以应付大部分的场景:
① 指针是什么?
② 指针的类型是什么?
③ 指针指向的类型是什么?
④ 指针指向了哪里?
2、如何使用指针
使用时的步骤如下:
① 声明指针变量;
② 初始化;
③ 访问指针指向的数据。
基于这个三个步骤,笔者将对整型数值类型的数据进行举例说明。
//-----------------声明指针变量
int* prt_a = nullptr;//声明一个整型数指针变量,nullptr—空指针
//-------------初始化指针变量,采用指向已有变量的方式-----
int a = 10; //定义整型数值常量
prt_a = &a;//指针指向了变量a的地址&a
//---------访问指针数据
int my_test = 0;
my_test = *prt_a;
cout << "a = " << a << endl;
cout << "my_test = " << my_test << endl;
cout << "*prt_a = " << *prt_a << endl;
//----------访问并修改指针指向的数据
*prt_a = 20;
cout << "a = " << a << endl;
cout << "*prt_a = " << *prt_a << endl;
运行结果如下:
代码解读:
① 声明一个整型数变量a,它的值为10,它的地址是&a,它在计算机上的执行原理是:在物理上,内存地址为&a的内存处,存放了 (int)10的编码,通过对该内存处的编码解码就可以得到(int)10;
② 声明一个指针变量prt_a,它指向了变量a的地址;
③ 通过解引用*prt_a,就可以获取指针变量指向的数据,也就是a的值,int(10);
④ 将指针变量指向的数据赋值给整型变量my_test ;
⑤ 将指针变量指向的数据修改为20,实际上也就是将整型变量a的值修改为20。
3、总结:
以上述案例来回答引言中的几个问题:
① 指针变量prt_a就是a的地址,也就是变量a存放在物理内存上的位置,把内存比作电影院的座位,指针变量就是座位的序号;
② 指针prt_a 的指针类型是int*,所以它指向的数据类型也必须是int;
③ 指针prt_a指向的数据类型是int;
④ 指针prt_a指向的是变量a的地址。
4、注意事项
① 两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义
② 指针的值是XX,相当于说该指针指向以XX为首地址的一片区域,这片区域的大小由指针指向的类型决定;
③ &是取地址运算符,*p 的结果是p 所指向的东西。