0

我不知道为什么我们必须(int *)在二维数组的情况下使用类型转换?我想知道的另一件事是,为什么我们不能使用*(*(p+i)+j))以下代码访问二维数组?总是需要使用p + col*i + j吗?为什么我不能使用*(*(p+i)+j))whenp包含数组的基地址并且*(*(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
        }
    }
}
4

2 回答 2

1

您的代码甚至无法编译,这正是您的第二个疑问所在。我已经更正了:

#include <stdio.h>                                                  
int main(int argc, char *argv[])                                    
{                                                                   
    int a[3][4] = {                                                 
        1,2,3,4,
        5,6,7,8,                                                  
        9,0,1,6,
    };                                                              

    int *p, i, j;                                                   
    p = a[0];       // No cast, just address the 1st row
    for (i = 0; i < 3; i++) {                                       
        for (j = 0; j < 4; j++) {                                   
            printf("%d", *(p + 4*i + j));   // corrected pointer arithmetic
        }                                                           
    }                                                               
}                                                                   

指针p不知道它正在寻址一个二维数组,它只是一个 int 指针。您确定要打印数字而不用空格分隔它们吗?

于 2013-09-15T18:39:52.167 回答
1

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

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 ) );
        }
    }
}
于 2013-09-15T18:40:53.040 回答