需要帮助理解 C 中指向 n 个元素类型的指针 (int (*p)[10])?

问题描述 投票:0回答:1

我正在研究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 是单指针而不是双指针,对吧?

arrays c pointers
1个回答
0
投票

数组已经指向它包含的值。

arr[1] == *arr;

如果

*parr = &arr
,它指向一个指向其他值的指针。

所以双重指向第一个值。 a 仅包含值。 arr 包含指向每个值的指针。

© www.soinside.com 2019 - 2024. All rights reserved.