根据定义,它是指向数组的指针变量。
我的代码打印三元素数组的值。
我的问题是,为什么使用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
相同,因此它取消引用指向3int
s数组的指针,从而有效地为您提供数组arr
。因此,*(ptr2arr[0] + i)
与*(*ptr2arr + i)
是相同的,这会给出正确的结果。
鉴于
printf("value at %p =%d\n" ,ptr2arr+i,*(ptr2arr[i]));
*(arr + i)
(syntalic sugar forptr2arr[i]
)“跳过”3ptr2arr + i
s的数组,因此只有当int
时,解引用它才会给出*(ptr2arr[i])
,否则它会给出位于地址arr[0]
的内容(未定义的行为)。PS:传递给
i = 0
的地址应该是arr + 3*sizeof i
,而不是printf
。有关更多详细信息,请参见dereferencing pointer to integer array。