gpt4 book ai didi

关于在 C 中打印字符串数组的困惑

转载 作者:太空宇宙 更新时间:2023-11-04 05:08:45 25 4
gpt4 key购买 nike

这可能是一个初学者问题,但一直让我感到困惑。我知道在 c 中,数组本身就是指向数组第一个元素的指针。所以考虑下面的例子

char *words[LENGTH];
words[0] = "zero";
words[1] = "one";
words[2] = "two";
printf("%s\n",*words);

最终打印的是。但是,我的理解是 words 是指向 words 数组第一个元素的指针,它是一个 char 指针 => words 是一个指针指向一个字符的指针。因此 *words 将是指向 char 的指针。因此我希望在这里打印一个内存地址而不是一个实际的字符串。我在这里误解了什么?

最佳答案

I understand that in c an array is itself a pointer to the first element of the array.

这是不正确的 - 在大多数情况下,类型为“T 的 N 元素数组”的表达式 将被转换为“指向T 的指针”类型的表达式,但是数组对象本身不是指针。没有为作为数组对象的一部分的指针预留存储空间。

字符串文字 "zero"具有类型“char 的 5 元素数组”,而两者都是 "one""two"具有类型“char 的 4 元素数组”(因为字符串以零值字符终止,您需要 N+1 个元素来存储 N 字符的字符串)。

每个字符串文字都是一个数组表达式,但由于这些表达式不是 sizeof 的操作数或一元 &运算符,并且由于它们不用于初始化字符数组,因此每个表达式都转换为指针表达式,并且每个表达式的值是数组第一个元素的地址。

Therefore I would expect a memory address to be printed here and not an actual string. What am I misunderstanding here?

%s转换说明符告诉 printf打印从指定地址开始的字符序列,直到它看到字符串终止符 - 这就是为什么你看到 zero作为输出而不是地址。要打印指针值,您可以使用 %p像这样的转换说明符:

printf( "%p\n", (void *) *words );

关于关于在 C 中打印字符串数组的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44348430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com