我正在扩展我对奥术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。所以,我的问题是,这两个片段之间有什么区别导致第一个输出垃圾?
由于
答案 0 :(得分:2)
此代码段无效,不得编译
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
中的值,它是test的地址(假设sizeof(int *)等于sizeof(int)。
因此函数的输出是test
的地址。
第二个代码段有效。 *p
是一个包含一个元素的数组,**P
给出了aray的第一个元素的值。