【发布时间】:2021-10-23 03:22:09
【问题描述】:
我有以下代码用于一维数组:
#include <stdio.h>
int main()
{
static int b[4] = {11, 12, 13, 14};
int (*p)[4];
p = b;
printf("%d \n", *(p + 1));
return 0;
}
即使我认为“b(数组名)”是一个指向一维数组的指针,我还是得到了一个编译错误
'=': cannot convert from 'int [4]' to 'int (*)[4]'
但是,如果我将 b 数组更改为二维数组“a(数组名称)”,则一切正常。这是否意味着,在 "int (*p)[4];" 的使用中,"*p" 必须如下表示 a[]:
static int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
int (*p)[4];
p = a;
因此,"int (*p)[4]" 仅在二维数组的行数上提供了灵活性。
对此问题有何见解?
【问题讨论】:
-
p = b;->p = &b;因为p是一个指向数组的指针。就像int a; int *p = &a;。在第二个二维数组示例中使用p = a,p指向a中的第一个一维数组。 -
我认为 b 本身就是一个地址,因为 b 是一个一维数组名。因此,p = b 而不是 p = &b。这里有什么问题?
-
@Cindy 不,
b是一个 数组。正如我的回答中提到的,数组可以衰减指向指针(指向它们的第一个元素),但它们本身不是指针(地址)。 -
@Cindy 和
b在您的示例中可以衰减为int *,但它仍然与int (*)[4]不同。&b是int (*)[4]类型,所以它可以工作。b(衰减为指针)和&b具有相同的地址但仍然是不同的类型。 -
(*p)[4] .. only provides flexibility in the number of rows-- 是的。 C 数组是行优先的(匹配存储布局)。要计算行的地址,编译器需要列数;如果想要列灵活,需要去掉[4],自己计算行;例如:int *p = b; p[2*4+1] = 3;将分配 row=2,col=1 值 3。或者如果您想将b视为 3 宽数组:p[2*3+1] = 3;将分配 row=2,col=1 值 3 . 将繁琐的类型放入定义中可能会有所帮助,既可以澄清事情,也可以防止它看起来像 c++:.
标签: arrays c pointers multidimensional-array implicit-conversion