我的理解是,当你声明一个指针时,比如说int *a = 5
,a
是指针,*a
是int指向的 - 所以*
表示你正在访问指针数据。(&
正在访问该地址)。希望这是正确的?
为什么当我做printf
它似乎没有按照我想要的方式工作?
int main()
{
int *a = 5;
printf("%dn",a);
return 0;
}
这给了我正确的结果,这是我没想到的。当我在 printf 中*a
而不是a
时,它失败了,我很困惑?
不,int *a = 5;
不会将5
的int
值存储到a
指向的内存位置,内存位置本身是5
的(这大多是无效的)。这是一个初始化语句,它初始化类型为 int *
(指向 5
的指针)的变量a
。
为了便于理解,请考虑以下有效案例
int var = 10;
int *ptrVar = &var;
在这里,ptrVar
被分配了 &var
的值,即指针。因此,换句话说,ptrVar
指向一个保存int
的内存位置,并且在取消引用ptrVar
时,我们将获得该int
值。
也就是说,总的来说,
printf("%dn",a);
是对未定义行为的邀请,因为您要将指针类型作为参数传递给%d
格式说明符。
int *a
确实声明a
是一个指针。因此,宣言
int *a = 5;
使用值 5 初始化a
。就像如何
int i = 5;
将使用值 5 初始化i
。
在极少数情况下,您希望使用文本值(0 或 NULL 除外)初始化指针变量。这些可能是嵌入式(或其他深奥的)应用程序,其中某些地址在特定平台上具有定义的含义。