我有一个一维数组的代码:
#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];"时,"* "必须表示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]"只提供二维数组的行数的灵活性。
对这个问题有什么见解吗?
数组自然会衰变为指向其第一个元素的指针,具体取决于上下文。也就是说,当这种衰变发生时,普通的b
与&b[0]
相同,它们具有int *
类型。由于p
和b
(或&b[0]
)的类型不同,您会得到一个错误。
对于a
,这里也是一样的,它衰变为指向其第一个元素的指针,即a
与&a[0]
相同。既然a[0]
是包含4
元素的数组,那么&a[0]
是指向四元素数组的指针,即int (*)[4]
。这也是第二个示例中p
的类型。
如果你有一个T
类型的对象,比如
T a;
则指向对象的指针的声明将看起来像
T *p = &a;
你的数组b
的类型是int[4]
。所以指向数组的指针应该是
int ( *p )[4] = &b;
要使用指针输出数组的第二个元素,你应该写
printf("%d n", *( *p + 1 ) );
因此编译器发出错误消息
不能从"int[4]"转换为"int (*) [4]
因为至少不用写
int ( *p )[4] = &b;
你写的
int ( *p )[4] = b;
另一方面,在少数例外情况下用于表达式的数组指示符被隐式转换为指向其第一个元素的指针。例如在
声明中int *p = b;
作为初始化式的数组b
被转换为指向其第一个元素的指针。上面的声明相当于
int *p = &b[0];
或者相同的
int *p = b + 0;
使用这个指针,你可以像
那样调用函数printf
printf("%d n", *(p + 1));
如果你有一个二维数组
int a[3][4];
然后在表达式中使用,它被转换为指向其类型为int[4]
的第一个元素的指针。所以你可以写
int ( *p )[4] = a;
如果你想将指向整个数组的指针声明为单个对象,你可以这样写
int ( *p )[3][4] = &a;
一个指向一维数组的指针,
不,它直接指向第一个元素。同样:
int *p = b;
就足够了。
数字4
在这里不属于任何类型;
static int b[] = {11, 12, 13, 14};
可以在声明中省略。(因为它是第一个维度,除非你将其设置为2D)
This (from AA)
int (*p)[4] = &b;
...
printf("%d n", *( *p + 1 ) );
只是:
的混淆和重载版本。int (*p)[] = &b;
...
printf("%d n", (*p)[1] );
这将b
替换为(*p)
,通常不是你想要的。