与数组一起使用的C语言指针
我编译并运行了以下代码,结果也在下面描述与数组一起使用的C语言指针,c,arrays,C,Arrays,我编译并运行了以下代码,结果也在下面描述 #include <stdio.h> int main(void) { char *ptr = "I am a string"; printf("\n [%s]\n", ptr); return 0; } 它不打印单个字符并停止。它所做的是打印出一个无法识别的字符,该字符完全脱离ASCII表。我不明白这是怎么发生的。我希望在这个问题上稍作澄清 据我所知,指针只能容纳地址,不能容纳地址 完整字符串 是字符串
#include <stdio.h>
int main(void) {
char *ptr = "I am a string";
printf("\n [%s]\n", ptr);
return 0; }
它不打印单个字符并停止。它所做的是打印出一个无法识别的字符,该字符完全脱离ASCII表。我不明白这是怎么发生的。我希望在这个问题上稍作澄清
据我所知,指针只能容纳地址,不能容纳地址
完整字符串
是字符串文字。字符串存储在只读位置,存储数据的地址返回指针ptr
它不打印单个字符并停止。它的作用是
它打印出一个无法识别的字符,该字符完全不正确
ASCII表。我不明白这是怎么发生的
ptr是一个指针,在printf()中使用错误的格式说明符会导致未定义的behvaior
使用%s
如果您提供字符串的存储地址,printf()也会打印整个字符串
char*ptr=“我是一个字符串”代码>
在末尾自动插入空字符。因此,当使用%s格式说明符执行printf时,它从字符串文本的地址开始,一直打印到空字符,然后停止 指针不包含字符串,而是指向字符串。(很容易记住,它被称为“指针”,而不是“支架”)。要想看出区别,请在黄色的便条上写下你的邮政地址。这张纸能支撑住你吗?不,它指向你。它保存着你的地址
指针在计算机上相当于邮政地址(实际上指针所持有的东西叫做地址)。他们不拿着像绳子一样的“真实的东西”,他们告诉“真实的东西”住在哪里
回到我们的字符串,指针实际上指向字符串的第一个字符,而不是整个字符串,但这不是一个问题,因为我们知道字符串的其余部分正好位于第一个chstricker的旁边
现在“%s”作为格式说明符需要一个指向字符串第一个字符的指针,因此您可以正确地将p
传递到printf
。OTOH%c
需要字符,而不是指针,因此在本例中传递p
会导致未定义的行为
那么为什么我们可以说类似于char*p=“abc”
?字符串文字是字符数组,在大多数情况下,数组衰减为指向其第一个元素的指针。数组到指针的衰减是C的另一个令人困惑的特性,但幸运的是,有很多关于它的信息。OTOH`char p=“abc”无效,因为字符不是数组(房子不是街道)。更多说明:%s的意思是-'这里有一个指向字符的指针,打印它和它后面的所有字符,直到到达字符==\0'。%c的意思是“这是一个字符-打印出来”的意思gopi和@pm100。你的回答完全回答了我的问题。非常感谢。为什么使用以下代码行printf(“\n[%c]\n”,ptr[2]);“ptr”被视为一个数组?我的意思是它显然是一个指针变量。但上述代码行工作完美,并打印出ASCII a;上例中的第三个字符。a[i]表示“地址a+(y*sizeof a)”处的对象。所以你在ptr+2上得到了东西。嘿,谢谢你花时间学习你的知识。在这种情况下,我有一个完全不同的问题。char*ptr=“我是一个字符串”;在C语言中允许,而char ptr=“我是字符串”;事实并非如此。那么这个初始声明称为字符串文字?还是别人叫它?
printf("\n [%c]\n", ptr);
char *ptr = "I am a string";