C++
int arr[5] = {1, 2, 3, 4, 5};
int (*p)[5] = &arr;我知道p是指向具有5个元素的数组的指针,但是当我试图打印地址时:
cout << p << " " << *p << " " << &arr << endl;它给了我:
0x7fff50c91930 0x7fff50c91930 0x7fff50c91930问题:
p怎么能等于*p?既然p等于&arr,为什么是*p != arr[0]?p和*p的值到底是什么?
发布于 2017-01-20 05:56:46

可以更清楚地想象,p指向了whole memory block of 5 int。因此,如果有一个( p + 1 ),它将指向下一个内存块。
这有助于回答你的问题。
为什么p等于*p?
p是指向初始化为指向arr[5]的array5的指针。
*p是第一个数组元素的值,它是arr[5]的地址。因为数组的名称是第一个元素的地址。因此,当您打印p和*p时,它们是相同的。
现在p等于&arr,为什么*p != arr?
*p是第一个数组元素的地址,这意味着整个arr[5]内存块的地址。另一方面,arr[0]是p指向的数组的第一个元素,因此它是一个实际值(1),而不是地址。
P和*p的值到底是多少?
作为您的第一个问题,它们都保存了整个arr[5]内存块的地址。
发布于 2017-01-20 05:56:05
首先,' int‘这是int类型' int*’这是int指针类型,因此int arr5 = {1,2,3,4,5};//声明和初始化五个整数的数组int* p5;//声明由五个整数指针组成的数组。
指针只存储一个引用。当我们使用*取消引用时,它给出了存储在该引用中的实际值。
int*是一种类型,只*是运算符(非引用运算符)。
int (*p)5 = & arr ;//通过这样做,您将声明由五个整数指针组成的数组,并且每个指针都使用arr的起始引用进行初始化。
要使用整数指针获取arr的值,可以使用p//1p//2等,指针p1、p2等也是如此。
发布于 2017-01-20 06:00:17
数组的名称通常计算为数组的第一个元素的地址,但有两个例外:
在这2种情况下,名称引用数组对象本身。
https://stackoverflow.com/questions/41756815
复制相似问题