为什么char*可以在C中保存一个char?

Ani*_*mj' 6 c string pointers

这可能听起来太疯狂但我只是想一想.在C为什么

char *pc = 'H';      // single character
char *ps = "hello";  // a string
Run Code Online (Sandbox Code Playgroud)

两者都有效吗?我的意思是为什么一个人char*可以持有/引用一个字符以及一个空终止的字符串?

为什么没有生成保护子句或编译器错误,*pc因为char*没有保存空终止字符串?

我在Ideone中检查了它并且没有得到任何警告.

Typ*_*eIA 10

可以保持一个,char因为有一个隐式转换charchar *(via int),因为sizeof(char *) >= sizeof(char).但是,您不应该这样做(从技术上讲,它是未定义的行为,因为字符的文字数值不太可能是某个char类型的有效指针地址).

在许多/大多数编译器中,这产生警告:

$ gcc -otest test.c
test.c:5: warning: initialization makes pointer from integer without a cast
Run Code Online (Sandbox Code Playgroud)


aja*_*jay 3

char *pc = 'H';
Run Code Online (Sandbox Code Playgroud)

上面的语句定义了pctype char *,这意味着它可以保存 type 的对象的地址charH您正在使用不同类型的字符来初始化它。请记住,字符文字是类型int,其计算结果是其字符代码,在 ASCII 中为72。所以,上面的语句等价于

char *pc = 72;
Run Code Online (Sandbox Code Playgroud)

这是非法操作,编译器应该警告您(在 gcc 中,使用标志-Wall)。您不应该直接将地址分配给指针,因为您不知道是否有权访问内存地址。您应该使用address of运算符&来获取对象的地址,然后将其分配给指针。

char *ps = "hello"; 
Run Code Online (Sandbox Code Playgroud)

在上面的语句中,字符串文字的计算结果是指向其第一个元素的指针。该地址被分配给ps相同类型的地址,即char *。但是,字符串文字在 中是只读的,C但没有const限定(与 中不同C++),因此尝试使用指针修改字符串文字ps不会导致编译器错误,但会导致未定义的行为,并且很可能由于段错误而导致程序崩溃。因此,您应该定义ps为指向 const 的指针object-

const char *ps = "hello";
Run Code Online (Sandbox Code Playgroud)