指向数组混淆的指针

时间:2015-03-06 15:02:36

标签: c++ c arrays pointers

根据定义,它是一个指向数组的指针变量。

我的代码打印三个元素数组的值。 我的问题为什么结果是正确使用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;
}

`

1 个答案:

答案 0 :(得分:2)

表达式ptr2arr[0]*ptr2arr相同,因此它取消引用指向3 int的数组的指针,为您提供有效的数组arr。因此,*(ptr2arr[0] + i)*(*ptr2arr + i)相同,与*(arr + i)相同,可为您提供正确的结果。

而在

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

ptr2arr[i]ptr2arr + i的语法糖)“跳过”3个int的数组,所以取消引用它*(ptr2arr[i])仅在arr[0]时{ {1}},否则它会为您提供位于地址i = 0的内容(未定义的行为)。


PS:传递给arr + 3*sizeof i的地址应为printf,而不是*ptr2arr + i

有关详细信息,另请参阅dereferencing pointer to integer array

相关问题