1、内存空间的访问
C++中动态和静态生存期变量的内存分配采用不同的方式,其中静态生存期变量的内存分配在程序运行之前就已完成,动态生存期变量的内存分配在程序运行到变量声明语句时才进行。
指针的典型应用场景为函数间需要传送大量的数据,传值必然消耗更多的空间,可以通过传递地址来避免这种消耗。C++中的指针和C中的概念相似,都是用来存储“内存单元地址”。
2、声明指针变量
指针变量和其它类型的变量,都遵循先声明后使用的规则。声明指针需要三个要素:指针指向对象的数据类型、“*”、指针名。比如下面声明一个指向浮点型变量的指针:
float *pointer;
其中float表明该指针可以指向float类型的变量,*表示声明的pointer是指针,pointer表示指针的名称。指针可以指向的类型包括:基本数据类型、数组和数组元素、函数、自定义类型的对象、本身之外的指针。
3、地址运算
C++中,地址运算操作符“*”和“&”包含多种语义,下面分别记录:
- 在指针声明语句中“*”表示声明变量为指针类型,如:float &pointer;
- 在执行语句中“*”表示取该指针指向对象的值,如:printf("%f n", *pointer);
- 在变量左边进行变量声明时,“&”表示声明引用,如:float &index=someFloatData;
- 在等号右边或在执行语句中,“&”表示取对象地址,如:float *pointer=&data或printf("%p n", &data);
4、指针赋值操作
在记录之前,再次声明初始化和赋值的区别:初始化表示在声明时进行值的指定、赋值表示在声明后进行值的指定。出于安全性的考虑,C++中指针必须先指定值再使用。指针的指定值包含初始化和赋值两种方式,如下:
/// 1、采用初始化指定值的方式,在声明同时指定值
float *pointer=&data;
/// 2、采用赋值的方式,在定义后再指定值
float *anoterPointer;
anoterPointer = &data;
此外,上面定义的两个指针指向的均为变量data,即C++允许同一个变量被多个指针指向。
5、数组名指针
在C++中,数组名本身就是不能被赋值的常量指针,用于表示数组的首地址,所以可以像使用指针一样的方式使用数组名,下面的例子使用数组名作为指针遍历数组的全部元素:
int data[4] = {1, 2, 3, 4};
for (int i=0; i < 4; i++) {
printf("%d n", *(data+i));
}
6、指针常量——不能改变指向对象的指针
如果一个指针被声明为指针类型的常量,那么该指针就只能指向一个对象,而不能再指向其他对象:
int *const pointer = &x;
/// 对常量类型的指针修改是不允许的,下面是错误的语句
pointer = &y;
7、void类型的指针
如果不知道指针将会指向什么类型的数据,那么可以使用void类型的指针。void类型的指针可以指向任何的对象的地址:
int data = 3;
void *pointer = &data;
/// 均可以得到data的地址
printf("%p n", pointer);
printf("%p n", &data);
但是,并不能在执行语句中使用“*pointer”访问pointer指向对象的值。
参考:
【1】https://blog.csdn.net/geekcome/article/details/6249151?reload