C语言指针与数组一起使用

时间:2015-02-04 17:13:22

标签: c arrays

我编译并运行了以下代码,结果也如下所示。

#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表的无法识别的字符。我不明白这是怎么回事。我会很感激在这个问题上的一些轻松。

3 个答案:

答案 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时,它从字符串文字的地址开始,并打印到空字符并停止。