指向数组的指针未按预期运行

时间:2014-08-23 16:29:32

标签: c arrays pointers

我正在扩展我对奥术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。所以,我的问题是,这两个片段之间有什么区别导致第一个输出垃圾?

由于

1 个答案:

答案 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的第一个元素的值。