我编译并运行了以下代码,结果也如下所示。
#include <stdio.h>
int main(void) {
char *ptr = "I am a string";
printf("\n [%s]\n", ptr);
return 0; }
** [我是一个字符串] **
我想了解如何在指针char中分配字符串。根据我的理解,指针只能包含一个地址,而不是一个完整的字符串。这里有一整句话。我不明白指针是如何让它以这种方式表现的。
如果我在上面的示例中更改了以下代码行,
printf("\n [%c]\n", ptr);
它不打印一个单一的字符并停止。它的作用是打印出一个完全超出ASCII表的无法识别的字符。我不明白这是怎么回事。我会很感激在这个问题上的一些轻松。
答案 0 :(得分:5)
根据我的理解,指针只能包含一个地址,而不是一个地址 完整的字符串
char *ptr = "I am a string";
字符串文字是字符串存储在只读位置,存储数据的地址返回指针ptr
。
它不打印一个单一的字符并停止。它的作用是什么 它会打印出一个完全不可识别的无法识别的字符 ASCII表。我不明白这是怎么发生的
ptr是一个指针,在printf()中使用了错误的格式说明符导致未定义的behvaior。
使用%s
如果提供存储字符串的地址,printf()会打印出整个字符串
答案 1 :(得分:2)
指针不保持字符串,指向字符串。 (容易记住,它被称为“指针”,而不是“持有者”)。要查看差异,请在黄色便条上写下您的邮寄地址。这张纸是否你?不,它指向你。它包含您的地址。
指针与计算机相当于邮政地址(实际上指针所持有的东西称为地址)。他们不像字符串那样持有“真实的东西”,他们告诉“真实的东西”在哪里生活。
回到我们的字符串,指针实际指向字符串的第一个字符,而不是整个字符串,但这不是问题,因为我们知道字符串的其余部分就在第一个字符旁边。< / p>
现在作为格式说明符的“%s”需要一个指向字符串第一个字符的指针,因此您可以正确地将p
传递给printf
。 OTOH %c
想要一个字符,而不是一个指针,所以在这种情况下传递p
会导致未定义的行为。
那么我们怎么能说char* p = "abc"
之类的东西呢?字符串文字是字符数组,在大多数情况下,数组衰减到指向其第一个元素的指针。数组到指针的衰减是C的另一个令人困惑的特性,但幸运的是,它上面有很多可用的信息。 OTOH`char p =“abc”无效,因为字符不是数组(房子不是街道)。
答案 2 :(得分:1)
另外
char *ptr = "I am a string";
自动在末尾插入一个空字符。因此,当您使用%s格式说明符执行printf时,它从字符串文字的地址开始,并打印到空字符并停止。