我不知道为什么在二维数组的情况下我们必须使用排版(int *)
我想知道的另一件事是,为什么我们不能在下面的代码中使用*(*(p+i)+j))来访问2d数组?总是有必要使用p + col*i + j?当*(*(p+i)+j))包含数组的基地址并且p等同于*(*(p+i)+j))时,为什么不能使用a[i][j]
提前谢谢你。

main()
{
    int a[3][4] = {
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int *p,i,j;
    p=(int *)a;       // this is my doubt why did we use int *
    for(i=0;i<3;i++)
    {
        for(j=0;j<4;j++) {
            printf("%d",*(*(p+i)+j));   // here is my 2nd doubt
        }
    }
}

最佳答案

您提供的代码由于以下行而无法编译:

printf("%d",*(*(p+i)+j));

在这里,你要解引用两次int*
您可以创建一个指针来引用数组a,类型为指针指向4个元素的数组。
请参阅所附代码,其中所有指针都是在执行嵌套for循环期间打印出来的。
#include<stdio.h>

main()
{
    int a[3][4]={
        1,2,3,4,
        5,6,7,8,
        9,0,1,6
    };

    int (*p)[4],i,j;
    p = a;
    for(i=0;i<3;i++){
        printf("row pointer: %p\n",p+i);
        for(j=0;j<4;j++){
            printf("element pointer: %p\n", (*(p+i))+j );
            printf("element: %d\n",*( (*(p+i)) + j ) );
        }
    }
}

关于c - 我无法知道(int *)的用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18815680/

10-15 05:53