解决关于指针的疑问

来源:互联网 发布:linux 原生 迅雷 64 编辑:程序博客网 时间:2024/05/19 16:51

今天被下面这两个语句弄得有点混:

int array1[5] = {};int *ptr1 = array1;

&

int array2[5] = {};int (*ptr2)[5] = &array2;

同样是指向一个维度为5的数组的指针,但是但从定义的方式上来看就可以知道,这两个还是有区别的:

首先ptr1是一个指向数组的指针,这里用array1去初始化ptr1,我们知道,当我们对数组进行操作的时候,大部分情况下相当于在操作指向数组首元素的一个指针,所以这里的ptr1指向的是array1的首元素。

而ptr2呢,在定义的时候已经指明了它所指向的数组的维度,这里为5,所以如果直接用array2去初始话它在语法上是行不通的,应为应用array2相当于应用了指向array2首元素的一个指针,而array2首元素的维度又不为5,它的类型是int*而非int (*)[5],所以编译就会出错,所以我们只能用取址符对array2进行取址,这样ptr2才指向了维度为5的数组,即ptr2指向的是整个数组,而非首元素,虽然array2和&array2的地址是一样的,因为我们通常用某个地址类表示从这个地址开始的大小不同的比特串,所以这两个是有区别的,既然ptr2指向的是整个数组,那我们要获取ptr2所指向的某个元素是就得用(*ptr2)[index]的形式,而不能是*ptr2[index],应为ptr2只指向一个元素,那就是array2这个整体,所以不能直接对其使用下标运算符,*ptr2[index]会是一个未定义的值,因为ptr2[index]指向了内存中某个本不存在的地方。

使用array1时,它的类型转换成int 而非int()[5]:
这里写图片描述

*ptr2[index]会是一些未定义的值:
这里写图片描述

只能使用(*ptr2)[index]:
这里写图片描述

而对于ptr1则可以使用ptr1[index]的形式,相当于*(prt1 + index):
这里写图片描述

总之一句话,(*ptr2)相当于ptr1.
这里写图片描述

1 0
原创粉丝点击