C 我对字符指针很好奇

C 我对字符指针很好奇,c,C,我了解到char*p表示指向char类型的指针 而且我想我也学会了char的意思是阅读 指针到达其“目标”后的内存量 因此,在 char *p = "hello World"; p包含字符串的地址和 p正指向它 质询 如果p指向字符串,它不应该只读取“h”吗??? 因为它只读取字符的大小? 为什么'printf%s,p打印整个字符串 我还从Rithcie的书中了解到指针变量不具有数据类型。 这是真的吗 所以你的字符串hello world占用了一些内存 [h][e][l][l][o][ ][w

我了解到char*p表示指向char类型的指针

而且我想我也学会了char的意思是阅读

指针到达其“目标”后的内存量

因此,在

char *p = "hello World";
p包含字符串的地址和

p正指向它

质询

如果p指向字符串,它不应该只读取“h”吗??? 因为它只读取字符的大小? 为什么'printf%s,p打印整个字符串

我还从Rithcie的书中了解到指针变量不具有数据类型。 这是真的吗


所以你的字符串hello world占用了一些内存

[h][e][l][l][o][ ][w][o][r][l][d][\0]
[0][1][2][3][4][5][6][7][8][9][A][B ]
实际上,指针p只指向第一个字节。在本例中,字节0。但是如果你把它用于

printf%s,p

然后printf知道打印直到得到空字符\0,这就是为什么它将打印整个字符串而不仅仅是“h”


至于第二个问题,指针确实具有数据类型。如果你大声说出来的话,这个名字可能类似于p的类型指针指向一个字符,或者int*i的指针指向一个整数。

所以你的字符串hello world占用了一些内存

[h][e][l][l][o][ ][w][o][r][l][d][\0]
[0][1][2][3][4][5][6][7][8][9][A][B ]
实际上,指针p只指向第一个字节。在本例中,字节0。但是如果你把它用于

printf%s,p

然后printf知道打印直到得到空字符\0,这就是为什么它将打印整个字符串而不仅仅是“h”


至于第二个问题,指针确实具有数据类型。如果你大声说出来的话,这个名字可能类似于p的类型指针指向一个字符,或者是int*i的整数指针。

这里*p是指向内存中某个位置的指针,它假定为1字节或字符。所以它指向“h”字母。所以p[0]或*p+0会给你p。但是,字符串以不可见的\0字符结尾,因此当您使用printf函数时,它会输出所有符号,从其中的一开始,*p指向并直到“\0”


指针只是一个变量,它可以保存一些地址4、8或更多字节。

这里*p是指向内存中某个位置的指针,它假定为1字节或字符。所以它指向“h”字母。所以p[0]或*p+0会给你p。但是,字符串以不可见的\0字符结尾,因此当您使用printf函数时,它会输出所有符号,从其中的一开始,*p指向并直到“\0”


指针只是一个变量,它可以保存一些地址4、8或更多字节。

指针变量不保存数据类型,它们保存一个地址。但是您使用一种数据类型,这样您就知道在使用该指针从内存中读取数据时,每一步将前进多少字节


调用printf时,表达式中的%s告诉函数从*p指示的地址开始读取,正如您所说,该地址保存“h”的字节值,并在到达终止字符时停止读取。这是一个没有视觉表示的字符,您在代码中将其称为\0。它告诉程序字符串的结束位置。

指针变量不包含数据类型,而是包含地址。但是您使用一种数据类型,这样您就知道在使用该指针从内存中读取数据时,每一步将前进多少字节

调用printf时,表达式中的%s告诉函数从*p指示的地址开始读取,正如您所说,该地址保存“h”的字节值,并在到达终止字符时停止读取。这是一个没有视觉表示的字符,您在代码中将其称为\0。它告诉程序字符串的结束位置。

对于问题:

我还从Rithcie的书中了解到指针变量不具有数据类型。这是真的吗

简单地说,是的

C中的数据类型用于在使用变量之前定义变量。变量的定义将为变量分配存储空间,并定义将保存在该位置的数据类型

C有以下基本的内置数据类型:int、float、double、char

引用

指针是派生的数据类型,每个数据类型都可以有一个与之关联的指针。指针没有关键字,但在变量和函数声明/定义中由前面的*标记。大多数编译器提供预定义的常量NULL,它相当于0

关于问题:

我还从Rithcie的书中了解到指针变量不具有数据类型。这是真的吗

简单地说,是的

C中的数据类型用于在使用变量之前定义变量。变量的定义将为变量分配存储空间,并定义将保存在该位置的数据类型

C有以下基本的内置数据类型:int、float、double、char

引用

指针是派生的数据类型,每个数据类型都可以有一个与之关联的指针。指针没有 e是关键字,但在变量和函数声明/定义中用前面的*标记。大多数编译器提供预定义的常量NULL,它相当于0

如果p指向字符串,它不应该只读取“h”吗??? 因为它只读取字符的大小?为什么printf%s、*p打印 整根绳子

将printf%s,*p更改为printf%c,*p,这样您就可以看到所需内容。两者都根据格式说明符(即字符串%s或字符%c)以不同的方式调用printf

要打印字符串,请使用printf%s,p

要打印字符,请使用printf%c,*p

第二个答案:指针拥有一个数据类型。这就是为什么你用char*p

如果p指向字符串,它不应该只读取“h”吗??? 因为它只读取字符的大小?为什么printf%s、*p打印 整根绳子

将printf%s,*p更改为printf%c,*p,这样您就可以看到所需内容。两者都根据格式说明符(即字符串%s或字符%c)以不同的方式调用printf

要打印字符串,请使用printf%s,p

要打印字符,请使用printf%c,*p


第二个答案:指针拥有一个数据类型。这就是为什么你用char*p

printf%s,*p错误。打印整个字符串应该是printf%s,p,或者打印第一个字符应该是printf%c,*p。这确实是一个复杂的细节,您需要正确处理。在你走得更远之前,你需要学习一些教科书。但声明中的anything*表示指向anything实体的指针。所以char*表示指向单个字符的指针。按照惯例,由于C没有字符串类型,char*的含义被重载,有时也表示指向相关字符序列中第一个字符的指针,可能以零字节结尾。但是这只是一个惯例,它不是语言的一部分。char的意思是读…-嗯?那是不对的。要么你的解释要么你的理解差了几步。char除了是char之外,没有其他意义。char*就是一个char的内存地址。除了“字符串”末尾的空终止符之外,没有目的地,但是char对此一无所知。但是printf将循环并找到%s的空终止符。我并不真的关心我写的syntex错误,我只是在专注于我的观点的同时不经意地键入,并犯了一个错误。我知道printf指的是地址类型。不管怎样,那也不是我的观点,还是谢谢你的回答,关于第二个问题,我不确定你是否100%正确。因为根据声明,假设指针有数据类型int*a,b;它声明int *a&int b,我认为编译器不把指针看作数据类型打印%s,*p是错误的。打印整个字符串应该是printf%s,p,或者打印第一个字符应该是printf%c,*p。这确实是一个复杂的细节,您需要正确处理。在你走得更远之前,你需要学习一些教科书。但声明中的anything*表示指向anything实体的指针。所以char*表示指向单个字符的指针。按照惯例,由于C没有字符串类型,char*的含义被重载,有时也表示指向相关字符序列中第一个字符的指针,可能以零字节结尾。但是这只是一个惯例,它不是语言的一部分。char的意思是读…-嗯?那是不对的。要么你的解释要么你的理解差了几步。char除了是char之外,没有其他意义。char*就是一个char的内存地址。除了“字符串”末尾的空终止符之外,没有目的地,但是char对此一无所知。但是printf将循环并找到%s的空终止符。我并不真的关心我写的syntex错误,我只是在专注于我的观点的同时不经意地键入,并犯了一个错误。我知道printf指的是地址类型。不管怎样,那也不是我的观点,还是谢谢你的回答,关于第二个问题,我不确定你是否100%正确。因为根据声明,假设指针有数据类型int*a,b;它声明了int *A和int B,我认为编译器不把指针当作数据类型感谢!!!我没有;在找到“\0”之前,我不知道%s的指示。谢谢!!我没有;在找到“\0”之前,无法知道%s所指示的