根据定义,它是指向数组的指针变量。
我的代码打印三元素数组的值。
我的问题是,为什么使用printf("Value at %p = %d\n", ptr2arr +i, *(ptr2arr[0]+i));
使用printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]))

#include <stdio.h>
int main(int argc, char* argv[])
{
    int arr[3] = {1,2,3};
    int (*ptr2arr)[3];
    int i;
    ptr2arr = &arr;
    for(i = 0; i<3; i++)
    {
    printf("Value at %p = %d\n", ptr2arr +i, *(ptr2arr[0]+i));
    }
    printf("-------------------\n");
    for(i = 0; i<3; i++)
    {
    printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]));
    }
   return 0;
}

`

最佳答案

表达式ptr2arr[0]*ptr2arr相同,因此它取消引用指向3ints数组的指针,从而有效地为您提供数组arr。因此,*(ptr2arr[0] + i)*(*ptr2arr + i)是相同的,这会给出正确的结果。
鉴于

printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]));

*(arr + i)(syntalic sugar forptr2arr[i])“跳过”3ptr2arr + is的数组,因此只有当int时,解引用它才会给出*(ptr2arr[i]),否则它会给出位于地址arr[0]的内容(未定义的行为)。
PS:传递给i = 0的地址应该是arr + 3*sizeof i,而不是printf
有关更多详细信息,请参见dereferencing pointer to integer array

10-06 05:06