Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与数组一起使用的C语言指针_C_Arrays - Fatal编程技术网

与数组一起使用的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";