无法使用指向整个数组的指针取消引用行

时间:2016-06-18 17:32:24

标签: c pointers

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

    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。

1 个答案:

答案 0 :(得分:1)

  

但是我收到错误消息无效使用带有未指定边界的数组。

添加rowCnt会产生错误,因为编译器根本不知道行所在的位置。为了让编译器知道这一点,您需要为指针数组提供 列大小 ,以便编译器了解 hop 到多少内存位置下一行。 (编译器需要知道这一点,因为内存是以连续的方式分配的,即直线)。

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