正如您所看到的,我已经使用printf
函数来使用指针打印2D数组,但是我得到了无效类型参数的错误。为了检查,我尝试打印下面的代码,其中我使用k
和指针c
来打印k
的值。我没有错误
int main ()
{
int a[3][2]={2,5,9,11,23,46};
int *p;
p=&a[0][0];
for(int i=0;i<=2;i++)
{
for(int j=0;j<=1;j++)
{
printf("n value of the 2 d array: %d",*(*(p+i)+j));
}
}
int k=6;
int *c;
c=&k;
printf("%d",*c);
}
你声明了一个指向int
的指针
int *p;
所以你只能对它解引用一次,如果你这样做,你将得到一个类型为int
的对象,你可以不应用一元操作符*。
在这个表达式
*(*(p+i)+j)
子表达式
*(p+i)
已经有了类型int
。因此,这个子表达式*(p+i)+j
也具有您试图解引用的int
类型。
您需要按照以下方式声明指针p
int ( *p )[2];
p = a;
表达式
(p+i)
指向i-th
"行"二维阵列a
。对指针表达式
*(p+i)
你会得到那个"row"类型为int[2]
的数组。在表达式中使用时,它被隐式转换为指向其第一个元素的指针。因此这个表达式
*(p+i)+j
的类型为int *
,并指向i-th
"行的j-th
元素。
对指针表达式解引用
*(*(p+i)+j)
您将获得i-th
"行"的j-th
元素。
由于p
的类型为int *
,表达式*(p + i)
的类型为int
,因此*(p + i) + j
的类型为int
,不能被解引用。
将表达式*(*(p + i) + j)
替换为*p++
:
printf("n value of the 2 d array: %d", *p++);
意志"行走";p
通过阵列;它开始指向a[0][0]
,++
操作符将指针向前移动,指向下一个元素。
你得到这个错误的原因是因为*(*(p+i)+j)
是无效的,让我们把它分解:
(*p+i)
p
存储2d数组中第一个元素的地址,即2。您已经将i的值添加到地址中,然后将其封装在*()
中,CC_34表示地址并返回一个整数。
*(*(p+0)+j)
*(2+j)
//由于您正在延迟整数
解决这个问题的方法很简单。创建一个指向整型数组的指针。
int (*p)[2] = a;
这样做的原因是因为它更容易通过二维数组移动,因为你的数组有3行2列:
int a[3][2]={2,5,9,11,23,46};
,你可以想象它看起来像这样:
{2,5}
{9,11}
{23,46}
现在你可以看到,如果我们单独引用每个数组,它会变得更容易。
int main ()
{
int a[3][2]={2,5,9,11,23,46};
int (*p)[2] = a;
for(int i=0;i<=2;i++)
{
for(int j=0;j<=1;j++)
{
printf("%d ", *(*(p+i)+j));
}
}
}
让我们分解*(*(p+i)+j)
:
*(p+i)
p存储第一个数组的地址,然后对其加上i,并将其移到数组的第一个元素。然后我们加上j,也就是沿着数组移动。最后,最外层的*()
去引用这个地址,并给我们一个int值来打印。