C 指向数组的指针未按预期运行
我正在扩展我的奥术C用法知识,特别是奇怪的指针类型。我找到了一个网站,上面有一些例子,我一直在尝试。然而,在玩了其中一些示例之后,我发现了一些与指向数组的指针相关的奇怪行为。代码如下:C 指向数组的指针未按预期运行,c,arrays,pointers,C,Arrays,Pointers,我正在扩展我的奥术C用法知识,特别是奇怪的指针类型。我找到了一个网站,上面有一些例子,我一直在尝试。然而,在玩了其中一些示例之后,我发现了一些与指向数组的指针相关的奇怪行为。代码如下: int test = 45; int *testp = &test; int (*p)[1]; p = &testp; printf("%d\n", **p); 这段代码输出2686744(我搞不懂)。我的逻辑如下:数组只是一个美化的指针。如果愿意,我可以制作一个指针并将其称为1数组。因此,当我
int test = 45;
int *testp = &test;
int (*p)[1];
p = &testp;
printf("%d\n", **p);
这段代码输出2686744(我搞不懂)。我的逻辑如下:数组只是一个美化的指针。如果愿意,我可以制作一个指针并将其称为1数组。因此,当我创建指针testp时,我希望它作为一个1 int的数组来运行。此外,我希望行int(*p)[1]
创建一个int**变量。然而,整件事还有更糟糕的地方。以下是上述代码的修改版本:
int test[1] = {45};
int (*p)[1];
p = &test;
printf("%d\n", **p);
如预期的那样,这将产生45项产出。所以,我的问题是,这两个片段之间有什么区别导致第一个片段输出垃圾
谢谢此代码段无效,不应编译
int test = 45;
int *testp = &test;
int (*p)[1];
p = &testp;
printf("%d\n", **p);
表达式&testp
的类型为int**
,而赋值的左侧有一个int(*)[1]
类型的对象。没有从一种类型到另一种类型的隐式转换
不过,在函数调用中取消对p的引用
printf("%d\n", **p);
也就是说*p将给出类型为int[1]
的数组,但是*p中存储的值是testp
的值。因此,数组的唯一元素是存储在testp
中的值,该值是测试的地址(前提是sizeof(int*)等于sizeof(int))
因此,函数的输出是test
的地址
第二个代码段是有效的。
*p
是一个包含一个元素的数组,**p
给出了数组第一个元素的值。p
是指向数组的指针,而不是指向指针的指针。但是指向数组函数的指针不应该作为指向指针的指针吗?不,即使指针和数组看起来可能相同它们不是。不,数组到指针的衰减(左值转换)只发生在最外层的类型。因此,在大多数表达式中,“T
”类型的元素数组衰减为指向T
类型的指针,但“array ofT
s”类型的元素数组只衰减为“指针到T
s”类型,而不是指向“指向T
s的指针"。这肯定是重复的,我正在寻找一个好的…至少是一个候选人,可能回答了你的问题…我现在明白了,谢谢你。但是,奇怪的是,gcc编译了第一个代码段…@Mahkoe:gcc编译了几乎所有可以编译的东西,默认情况下,它编译了一些程序,这就是我nvalid符合C标准。我想你对此有一个警告。@Mahkoe我收到错误消息error:assignment from compatible pointer type,当用gcc编译代码时。@VladfromMoscow:我很确定这只是一个警告,如果不是用-Werror
或-pedantic errors
或其他一些选项编译的话…