c - 做 `char first_word[MAX_LENGTH + 1] = "test";`时,first_word是指针还是字符串?

标签 c pointers c-strings

<分区>

我有这个代码:

char first_word[MAX_LENGTH + 1] = "test";
printf("Word to input: %s\n", first_word);
printf("Word to input: %p\n", first_word);

它对两者都成功打印(打印字符串“test”,然后是地址)。

在我的代码中,我最终会这样做:

char *arr_of_strings[MAX_LENGTH + 1];
arr_of_strings[0] = first_word;

并且它正确地将 arr_of_strings[0] 设置为 first_word 是什么(在本例中是一个指针,因为 *arr_of_strings 是一个数组的指针,对吧?)。但是现在当我这样做的时候

printf("arr at 0 is: %s\n", arr_of_strings[0]);

它又打印了一个字符串,我也可以这样打印一个地址吗:

printf("arr at 0 is: %p\n", arr_of_strings[0]);

那么 c 什么时候将 first_word 用作字符串,什么时候将它用作指针?

最佳答案

正确答案是字符数组的标识符。

  • 不是字符串,因为字符串甚至不是 C 中的类型。C 中的字符串被定义为一系列字符,包括一个0/'\0' 字符结尾(表示结束)。所以,first_word 可以保存 一个字符串,但不能说它 一个字符串。它可以容纳任何 char 序列,而不仅仅是字符串。

  • 不是指针,尽管在​​大多数情况下它计算为指针。除了与 sizeof_Alignof& 一起使用时,数组的标识符被评估为指向它的第一个元素的指针。因此,first_word 在许多上下文中将具有 char * 类型(指针类型),例如,您可以将其分配给一个指针,如 char *foo = first_word。不过,评估 指针并不意味着它 指针。运算符 sizeof_Alignof& 在数组上使用与在指针上使用时的计算结果截然不同。


关于您关于 printf 的问题:printf 中的 %s 需要传递一个指向 char (char *) 的指针,并期望该指针指向一个字符串。我希望你在阅读上面的解释后明白这意味着什么。

关于c - 做 `char first_word[MAX_LENGTH + 1] = "test";`时,first_word是指针还是字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45685470/

相关文章:

c - 通用环形缓冲区

c - 指向返回结构指针的函数的指针

计算每个单词在给定句子中出现的次数

函数调用中未填充 C 字符串

C++从函数返回指向数组的指针的正确方法

c++ - 使用指针时继承不起作用

c - 打印字符数组

c - 在 C 中分配结构的字符串字段

html - 简单的 HTML 布局引擎?

c - 将除\r 之外的所有字符添加到新字符串