我曾多次遇到过这种说法char* ch = "hello";
。
我知道这char* ch
表明这ch
是指向 a 的指针 char
。但是将hello分配给 ch 是什么意思?
我无法理解这一点?请帮忙。
这意味着ch
是一个指向字符的指针。当您这样做时,char* ch = "hello"
ch
将指向第一个字符,即 character h
。要指向第二个字符,您可以执行ch + 1
或ch[1]
。请注意,理想的类型ch
应该是const char*
因为您不能写入指向的内存位置。
字符串文字静态存储在程序二进制文件中的某处。它们很可能被加载到内存中的只读“数据”部分,但这是未定义的行为。
分配字符串文字只是传递第一个字节的地址;在这种情况下,char* ch
指向“hello”中的“h”。
注意:修改静态字符串是未定义的行为!虽然您可以获得指针,但任何分配都是危险的。
这里发生了几件事。
"hello"
等于{ 'h', 'e', 'l', 'l', 'o', '\0' }
。即,它是一个字符数组。数组可以隐式转换为相应的指针类型。所以这里的语句确实创建了一个(静态)字符数组,并将指向第一个元素的指针分配给变量ch
(顺便说一下,命名不好)。
该语句编译为:
080483b4 <main>:
80483b4: 55 push %ebp
80483b5: 89 e5 mov %esp,%ebp
80483b7: 83 ec 10 sub $0x10,%esp
80483ba: c7 45 fc 94 84 04 08 movl $0x8048494,-0x4(%ebp)
80483c1: c9 leave
80483c2: c3 ret
0x8048494 处的字符串是“hello\0”,如 xxd 所示:
0000490: 0100 0200 6865 6c6c 6f00 0000 011b 033b ....hello......;