2015-10-17 91 views
1
#include <stdio.h> 
int main() 
{ 
    int a[][3] = {1, 2, 3, 4, 5, 6}; 
    int (*ptr)[3] = a; 
    printf("%d %d \n ", (*ptr)[1], (*ptr)[2]); 
    ++ptr; 
    printf("%d %d\n", (*ptr)[1], (*ptr)[2]); 
    ptr++; 
    printf("%d %d\n", (*ptr)[1], (*ptr)[2]); 
    return 0; 
} 

谁能为什么在第一个printf解释,(* PTR)[1],(* PTR)[2]是给2,3作为输出?指针阵列顺从

不是(*ptr)[1]输出应为4和(*ptr)[2]输出应该0?

是它意味着(*ptr)[1]等于ptr[0][1](*ptr)[2]装置ptr[0][2]

回答

1
int (*ptr)[3]

限定一个指向3个元素的数组。

因此访问(*ptr)[1]指的是现在ptr指向的数组的第二个元素(例如它指向的是包含2的位置)。把它想象成一个矩阵。 Ptr指向该行(例如,它将指向包含4的位置)。

现在关于ptr++。编译器知道ptr指向一个由3个int元素组成的数组。所以步骤ptr++将指针递增3 * sizeof(int)。在我们的矩阵类比中,ptr现在指向下一行。 (* ptr)[1]等于ptr [0] [1]和(* ptr)[2]意味着ptr [0] [2]?“是正确的

0

首先,你需要记住,

int a[][3] = {1, 2, 3, 4, 5, 6}; 

相同

int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; 

int (*ptr)[3] = a; 

相同

int (*ptr)[3] = &a[0]; 

现在,(*ptr)[1]第一指针引用ptr导致第一子阵列。然后,[1]获取从第一子阵列,其是2。类似地,第一(*ptr)[2]解引用ptr通向第一子阵列的第二元件。然后,[2]得到第三元件从所述第一子阵列,其是3

接着,

++ptr; 

增量ptr这意味着,现在,它指向所述第二子阵列的地址。所以现在,(*ptr)[1]首先解引导ptr导致第二个子数组。然后,[1]获取从第二子阵列,其是4同样,(*ptr)[2]第一解引用ptr通向第二子阵列的第二元件。然后,[2]获取从第二子阵列,其是5

现在所述第三元件,

ptr++; 

进一步增量ptr这意味着它现在指向存储器addess 过去第二子阵列或二维阵列。在此之后,如(*ptr)[1](*ptr)[2]中所示,清除指针时将调用未定义的行为,因为您正在读取阵列之后的无效内存地址。

最后,

是不是就意味着(*ptr)[1]等于ptr[0][1](*ptr)[2]意味着ptr[0][2]

是。正确。

+0

感谢您的酷解释:) –

+0

不客气!如果答案回答你的问题,鼓励[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。 –