我一直在浏览该网站,但尚未找到此问题的答案。
用一个例子来解释这个问题是最简单的(至少对我来说)。
我不明白为什么这是有效的:
#include <stdio.h>
int main(int argc, char* argv[])
{
char *mystr = "hello";
}
但这会产生编译器警告(“初始化使指针来自整数而不进行强制转换”):
#include <stdio.h>
int main(int argc, char* argv[])
{
int *myint = 5;
}
我对第一个程序的理解是创建一个名为 mystr 的指针类型的变量,其值是字符串文字“hello”的第一个字符('h')的地址。换句话说,通过此初始化,您不仅可以获得指针,还定义了指针指向的对象(在本例中为“hello”)。
那么为什么呢int *myint = 5;
似乎没有实现类似的东西,即创建一个名为 myint 的指针类型的变量,其值是值“5”的地址?为什么这个初始化不既给我指针又定义指针指向的对象?
事实上,您可以使用复合文字,这是 1999 年 ISO C 标准添加到该语言中的功能。
字符串文字的类型是char[N]
, where N
是字符串的长度加 1。像任何数组表达式一样,它是隐式的转换的在大多数但不是所有上下文中,指向指向数组第一个元素的指针。所以这:
char *mystr = "hello";
分配给指针mystr
其内容为的数组的初始元素的地址"hello"
(随后是终止'\0'
空字符)。
顺便说一句,这样写更安全:
const char *mystr = "hello";
整数没有这样的隐式转换——但你可以这样做:
int *ptr = &(int){42};
(int){42}
是一个复合文字,它创建一个匿名int
对象初始化为42
; &
获取该对象的地址。
但要小心:由字符串文字创建的数组始终具有静态存储持续时间,但由复合文字创建的对象可以具有静态或自动存储持续时间,具体取决于它出现的位置。这意味着如果ptr
从函数返回,具有值的对象42
当指针仍然指向它时,它将不复存在。
As for:
int *myint = 5;
尝试分配值5
到一个类型的对象int*
。 (严格来说是初始化而不是赋值,但效果是一样的)。由于没有隐式转换int
to int*
(特殊情况除外0
被视为空指针常量),这是无效的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)