通常,如果您执行以下操作:
int * i = &someint;
它只是一个指向变量的指针。
但是,当你这样做时
char * str = "somestring";
它会自动把它变成一个数组。是指针在做这个,还是只是初始化语法的语法糖?
最佳答案
不,字符串文字 "somestring"
已经是一个字符数组,几乎可以肯定是由您的编译器创建的。
该语句所做的是将 str
设置为指向第一个字符。如果您要查看底层的汇编代码,它可能看起来像:
str314159: db "somestring", 0 ; all string literals here.
: : : :
load r0, str314159 ; get address of string
stor r0, -24[sp] ; store it into local var str.
在很多情况下,数组会衰减为指向该数组第一个元素的指针(有一些有限的异常(exception),例如在执行 sizeof
时)。
例如,以下C代码:
#include <stdio.h>
int main (void) {
char *somestr = "Hello";
puts (somestr);
return 0;
}
当用 gcc -S
编译生成 x86 程序集时,给我们(去除了不相关的杂物):
.LC0:
.string "Hello"
.text
.globl main
.type main, @function
main:
pushl %ebp ; Standard set up of stack frame,
movl %esp, %ebp ; aligning and making
andl $-16, %esp ; room for
subl $32, %esp ; local variables.
movl $.LC0, 28(%esp) ; Load address of string in to somestr.
movl 28(%esp), %eax ; Call puts with that variable.
movl %eax, (%esp)
call puts
movl $0, %eax ; Set return code.
leave ; Tear down stack frame and return.
ret
您可以看到第一个字符的地址.LC0
确实加载到了somestr
变量中。而且,虽然可能不是很明显 .string
确实创建了一个以 NUL 字符结尾的字符数组。
关于c++ - 是什么让 char * 成为一个字符数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8470059/