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