C - 一元 '*' 的类型参数无效(有 int)



正如您所看到的,我已经使用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值来打印。

相关内容

  • 没有找到相关文章

最新更新