为什么指向数组的指针返回一个地址,但指向整数的指针返回整数本身

时间:2017-03-23 04:28:07

标签: c

为什么此代码返回一个地址:

#include <stdio.h>
int main() { // An example function, with its own context
int i[1] =3 ;
int *pointer;
pointer = i;
printf("%p",pointer);
return 0;
}

但这会返回0x3,换句话说,返回整数本身?:

#include <stdio.h>
int main() { // An example function, with its own context
int i=3 ;
int *pointer;
pointer = i;
printf("%p",pointer);
return 0;
}

3 个答案:

答案 0 :(得分:3)

i是数组时,i的大部分时间都是&i[0]的缩写,即指向第一个元素的指针。因此pointer = i;使pointer指向i的第一个元素。请注意,指针不指向数组(因为它使用pointer = &i;,而是指向第一个元素。

i是整数时,没有这样的规则。因此,您的程序只是尝试将3解释为要指向的地址。任何好的编译器都应该给你一个警告,提醒你这可能不是你的意思。

答案 1 :(得分:0)

当您取消引用指针时,将检索引用对象的内容。

如果你有一个指向int的指针而你取消引用它,那么你得到一个整数值,它存储在指针所指向的地址。

int a = 1;
int *p = &a;

--> p retrieves the address of a
--> *p retrieves the value at the address of a

如果你有一个指向数组的指针并且你取消引用它,那么你在内存中得到一个地址,该地址存储在数组指向的地址。数组本身只是一个指针,它指向数组第一个元素的内存地址。

int a[] = {0, 1, 2, 3, 4};
int *p = a;

--> a retrieves the address of the first element: 0
--> p does the same; it has a's address

这应该解释你的第一个例子:

#include <stdio.h>
int main() { // An example function, with its own context
int i[1] =3 ;
int *pointer;
pointer = i;
printf("%p",pointer);
return 0;
}

然而,你的第二个例子是不恰当的(我甚至说错了)。这是因为您正在打印的指针仍显示地址而不是整数。您只是使用整数将其值3存储在该指针中作为地址。我相信这是未定义的行为。尝试取消引用指针,看看你是否可以理解它;你不能,而你的程序可能会崩溃。

#include <stdio.h>
int main() { // An example function, with its own context
int i=3 ;
int *pointer;
pointer = i;
printf("%p",pointer);
return 0;
}

答案 2 :(得分:0)

对于编译器,数组名称是一个地址。这就是为什么在第一个代码中只使用数组名i足以将内存地址返回给指针。但是,对于变量,变量名前面需要&以将变量的内存地址返回给指针。因此,在第二段代码中,只写pointer = i;不够,而应该是pointer = &i;

但我认为为什么你得到3的输出是因为指针认为存储在i中的3是指向的地址。