我已经声明了一个数组和一个指向整个数组的指针,如下代码所示(注:我这样做只是为了理解这个概念,我不打算使用这种方法相反,我将使用指针数组方法)

    int ar1[3][3]={
                    {11,12,13},
                    {21,22,23},
                    {31,32,33},
                    };
    int (*intPtrToAr1)[] = &ar1[0];
    int rowCnt;
    int colCnt;
    for(rowCnt=0;rowCnt<3;rowCnt++)
    {
        for(colCnt=0;colCnt<3;colCnt++)
        {
            printf("%d\t",*(*(intPtrToAr1)+colCnt));
        }
        printf("\n");
    }

我能够正确地反引用第一行的元素如上所述,代码打印第一行3次但我无法取消对后续行的引用我试着用一些像
printf("%d\t",*(*(intPtrToAr1+rowCnt)+colCnt));

但我得到错误消息,数组的使用无效,边界未指定我知道有些问题我的理解是intPtrToAr1指向整个数组,因此intPtrToAr1+rowCnt将指向后续行但找不到问题的确切原因我提到了SO link但我想这和那篇文章有点不同我用的是Code::Blocks和mingw。

最佳答案

但我得到错误消息,数组使用无效,边界未指定。
添加rowCnt会产生错误,因为编译器根本不知道行的位置要让编译器知道这一点,需要给指针数组指定列的大小,以便编译器知道跳到下一行的内存位置(编译器需要知道这一点,因为内存是以连续的方式(即直线)分配的)。

int (*intPtrToAr1)[3] = &ar1[0];

然后要取消对行的引用,只需将rowCnt添加到print语句中,如下所示:
printf("%d\t",*(*(intPtrToAr1+rowCnt)+colCnt));

输出:
$ gcc test.c && ./a.out
11      12      13
21      22      23
31      32      33

关于c - 无法使用指向整个数组的指针取消引用行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37899809/

10-13 06:28
查看更多