sav*_*v0h 5 c int pointers char
我一直在浏览网站,但尚未找到答案.
用一个例子来解释这个问题是最容易的(至少对我来说).
我不明白为什么这是有效的:
#include <stdio.h>
int main(int argc, char* argv[])
{
char *mystr = "hello";
}
Run Code Online (Sandbox Code Playgroud)
但是这会产生一个编译器警告("初始化使整数从没有强制转换的整数中生成"):
#include <stdio.h>
int main(int argc, char* argv[])
{
int *myint = 5;
}
Run Code Online (Sandbox Code Playgroud)
我对第一个程序的理解是创建一个名为mystr的变量,类型为pointer-to-char,其值是字符串文字"hello"的第一个字符('h')的地址.换句话说,使用此初始化,您不仅可以获取指针,还可以定义指针指向的对象(在本例中为"hello").
那么,为什么int *myint = 5;
看起来似乎没有实现与此类似的东西,即创建一个名为myint的变量类型指针指向int,其值是值'5'的地址?为什么这个初始化既不给我指针也定义指针所指向的对象?
实际上,您可以使用复合文字来实现,这是1999 ISO C标准添加到该语言中的一项功能.
字符串文字是类型char[N]
,其中N
是字符串的长度加1.与任何数组表达式一样,它在大多数但不是所有上下文中都隐式转换为指向数组第一个元素的指针.所以这:
char *mystr = "hello";
Run Code Online (Sandbox Code Playgroud)
为指针指定mystr
内容为"hello"
(后跟终止'\0'
空字符)的数组的初始元素的地址.顺便说一句,写起来更安全:
const char *mystr = "hello";
Run Code Online (Sandbox Code Playgroud)
整数没有这种隐式转换 - 但你可以这样做:
int *ptr = &(int){42};
Run Code Online (Sandbox Code Playgroud)
(int){42}
是一个复合文字,它创建一个int
初始化为的匿名对象42
; &
获取该对象的地址.
但要小心:由字符串文字创建的数组始终具有静态存储持续时间,但复合文字创建的对象可以具有静态或自动存储持续时间,具体取决于它出现的位置.这意味着如果ptr
从函数返回值,则42
当指针仍然指向它时,具有该值的对象将不再存在.
至于:
int *myint = 5;
Run Code Online (Sandbox Code Playgroud)
尝试将值分配给5
类型的对象int*
.(严格来说,这是初始化而不是赋值,但效果是一样的).因为有从没有隐式转换int
到int*
(比的特殊情况下其他0
被当作一个空指针常数),这是无效的.