c - 指针程序

标签 c arrays pointers

int main()
{
    static int a[2][2] = {1, 2, 3, 4};
    int i, j;
    static int *p[] = {(int*)a, (int*)a+1, (int*)a+2};
    for(i=0; i<2; i++)
    {
        for(j=0; j<2; j++)
        {
            printf("%d, %d, %d, %d\n", *(*(p+i)+j), *(*(j+p)+i),
            *(*(i+p)+j), *(*(p+j)+i));
        }
    }
    return 0;
}

当我运行此代码时,输​​出为:

1, 1, 1, 1  
2, 2, 2, 2  
2, 2, 2, 2  
3, 3, 3, 3

有人可以解释一下这段代码是如何工作的吗?

最佳答案

printf中的四种指针操作:

*(*(p+i)+j)
*(*(j+p)+i)
*(*(i+p)+j)
*(*(p+j)+i)

评估以下内容:

*(*(p+i)+j) -> *(p[i]+j) 
*(*(j+p)+i) -> *(p[j]+i)
*(*(i+p)+j) -> *(i[p]+j) 
*(*(p+j)+i) -> *(j[p]+i)

p[n]n[p] 相同,因为指针逻辑(如上所示)围绕 + 是可交换的。
请参阅this question了解更多详情。

所以实际上只有两个语句:

*(p[i]+j) 
*(p[j]+i)

当然,这只是p + 偏移[x] + 偏移。所以实际上,这只是一个声明:

*p[i+j]

这当然是存储在 p 数组中偏移量 i+j 处的值。

由于嵌套循环,i和j的值如下:

i j  i+j
0,0   0
0,1   1
1,0   1
1,1   2

所以它依次打印p每个位置的值(1,2,23)四次。

关于c - 指针程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25974478/

相关文章:

pointers - 在 Go 中,我如何检查一个值是(任何)指针类型?

c++ - 为什么 int 指针的 const vector 中的取消引用元素是可变的?

c - 具有零长度数组的结构的大小是多少?

c - C 中 atoi 的段错误

我可以从我的内核模块调用 mknod 吗?

c - C 中的 fscanf 动态数组?

c++ - 这个条件如何成立

c - 什么类型的程序最好用C写

arrays - 在 gradle.properties 文件中声明数组/ HashMap

java - 我可以在 java 中用变量命名数组吗?