不允许指针指向不完整的类类型_C++日志(十九)指针的声明、地址运算、赋值、数组名指针、指针常量、void指针...

039c986c0c5ce5a39ce603f85722b81e.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值