Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 指向数组的指针未按预期运行_C_Arrays_Pointers - Fatal编程技术网

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数组。因此,当我

我正在扩展我的奥术C用法知识,特别是奇怪的指针类型。我找到了一个网站,上面有一些例子,我一直在尝试。然而,在玩了其中一些示例之后,我发现了一些与指向数组的指针相关的奇怪行为。代码如下:

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 of
T
s”类型的元素数组只衰减为“指针到
T
s”类型,而不是指向“指向
T
s的指针"。这肯定是重复的,我正在寻找一个好的…至少是一个候选人,可能回答了你的问题…我现在明白了,谢谢你。但是,奇怪的是,gcc编译了第一个代码段…@Mahkoe:gcc编译了几乎所有可以编译的东西,默认情况下,它编译了一些程序,这就是我nvalid符合C标准。我想你对此有一个警告。@Mahkoe我收到错误消息error:assignment from compatible pointer type,当用gcc编译代码时。@VladfromMoscow:我很确定这只是一个警告,如果不是用
-Werror
-pedantic errors
或其他一些选项编译的话…