我正在研究C中的指针并编写了以下代码:
int main(){
int a = 10;
int *pa = &a;
printf("Value of pa : %p\n",pa); //0x7fffd215b5b8
printf("Value of *pa : %d\n", *pa); //10
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int (*parr)[10] = &arr;
printf("Address of arr : %p\n", &arr); //0x7fffd215b5d0
printf("Address of parr : %p\n", &parr); //0x7fffd215b5c0
printf("Value of parr : %p\n", parr); //0x7fffd215b5d0
printf("Value of *parr : %p\n", (*parr)); //0x7fffd215b5d0 <---WHY?
printf("Value of first element : %d\n", **parr); //1
//Inorder to print elements using pointer parr
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++)
printf("%d\t", *((*parr)+i));//1 2 3 ... values stored in arr
return 0;
}
对于指针pa来说,它保存的值是变量a的地址。当我们执行*pa时,我们取消引用(p的值)/(a的地址),即*(0x7fffd215b5b8),它等于10。
对于指针parr,它保存的值是10个元素的数组的基地址(0x7fffd215b5d0)。难道 *parr 即 *(0x7fffd215b5d0) 不应该像 *pa 之前所做的那样取消引用它包含的值并输出 1 吗?为什么 *parr 显示它包含的值,即 arr 的基地址?
为什么我需要取消引用指针两次才能获取数组的值(我已经通过反复试验设法获得输出,但并不真正理解为什么它应该以这种方式工作)。我初始化的指针 *parr 是单指针而不是双指针,对吧?
数组已经指向它包含的值。
arr[1] == *arr;
如果
*parr = &arr
,它指向一个指向其他值的指针。
所以双重指向第一个值。 a 仅包含值。 arr 包含指向每个值的指针。