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