什么使char*成为一系列字符?

zeb*_*und 12 c c++ arrays pointers char

通常,如果您执行以下操作:

int * i = &someint;

它只是一个指向变量的指针.

但是,当你这样做的时候

char * str = "somestring";

它会自动将其转换为数组.它是执行此操作的指针,还是初始化语法的语法糖?

pax*_*blo 14

不,字符串文字"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.
Run Code Online (Sandbox Code Playgroud)

在很多情况下,数组会衰减到指向该数组的第一个元素的指针(有一些有限的例外,比如在做的时候sizeof).


举例来说,以下C代码:

#include <stdio.h>

int main (void) {
    char *somestr = "Hello";
    puts (somestr);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当编译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
Run Code Online (Sandbox Code Playgroud)

您可以看到第一个字符的地址.LC0确实已加载到somestr变量中.而且,虽然它可能不会立即显现.string,但是创建一个由NUL字符终止的字符数组.