c++ - 是什么让 char * 成为一个字符数组?

标签 c++ c arrays pointers char

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

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/

相关文章:

python - 如果从源代码构建 BCC 后 "sudo/usr/share/bcc/tools/execsnoop"失败,我该怎么办?

c - 在C中查找char的最大值

c - gstreamer 插件库未链接到 opencv 共享对象库 - Ubuntu 上的 "undefined symbol"

c - 我不确定如何跟踪代码数组?

c++ - std::min_element 从类对象返回意外结果

c++ - 拥有 [[nodiscard]] 类型的理由是什么?

c++ - 使用 string.pop_back() 和 string.back()

c++ - printf有什么替代品吗?

用于棋盘的 Java 2D 数组无法正常工作

c++ - 在包含数组中存在的所有元素的数组中找到最短的范围