字符串文字是一种特殊情况:它们触发静态内存中文字的创建,并将其作为char
大批。请注意,尽管以下内容无法编译42
是一个int
字面量,因为它不是隐式分配的:
int *p = &42;
在所有其他情况下,您负责分配指向的对象,无论是在自动内存还是动态内存中。
int i = 42;
int *p = &i;
Here i
是自动变量,p指向它。
int * i;
*i = 42;
您刚刚调用了未定义的行为。i
尚未初始化,因此指向内存中随机的某个位置。然后你分配了42
到这个随机位置,后果不可预测。坏的。
int *i = malloc(sizeof *i);
Here i
被初始化为指向动态分配的内存块。别忘了free(i)
一旦你完成了它。
int i = 42, *p = &i;
以下是如何创建一个自动变量和一个指向它的指针作为一行。i
是变量,p
指向它。
Edit :看起来像你really希望该变量被隐式且匿名地分配。好吧,你可以这样做:
int *p = &(int){42};
这个东西是一个复合文字。它们是具有自动存储持续时间(或在文件范围内静态)的匿名实例,并且仅存在于 C90 及更高版本中(但不存在于 C++ 中!)。与字符串文字相反,复合文字是可变的,即您可以修改*p
.
Edit 2 :添加此解决方案的灵感来自另一个答案 https://stackoverflow.com/a/24806060/3233393(不幸的是,它提供了错误的解释)为了完整性:
int i[] = {42};
这将分配一个具有自动存储持续时间的单元素可变数组。数组的名称,虽然不是指针本身 https://stackoverflow.com/questions/4607128/in-c-are-arrays-pointers-or-used-as-pointers,将根据需要衰减为指针。
但请注意sizeof i
将返回“错误”结果,即数组的实际大小(1 * sizeof(int)
) 而不是指针的大小 (sizeof(int*)
)。然而,这应该很少成为一个问题。