为什么此代码返回一个地址:
#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;
}
答案 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是指向的地址。