我了解到char * p的意思是“指向char类型的指针”
而且我想我也学会了char意味着阅读
指针到达其“目标”后的内存量。
如此确凿,
char *p = "hello World";
p包含字符串的地址和
p
正指向它
Qusetions。
如果p指向字符串,不应该只读取'h'???
因为它只读取char的大小?
为什么`printf(“%s”,p)打印整个字符串???
我还在Rithcie的书中了解到指针变量不具备数据类型。 真的吗???
答案 0 :(得分:5)
所以你的字符串“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
的“指向整数的指针”。
答案 1 :(得分:1)
指针变量不包含数据类型,它们保存一个地址。但是你使用一种数据类型,这样你就可以知道在使用该指针从内存中读取时,每一步都要前进多少字节。
当你调用printf
时,表达式中的%s
告诉函数开始读取* p指示的地址(它确实保存'h'的字节值,如你所说),在到达终止字符时停止阅读。这是一个没有直观表示的角色(在代码中将其称为\0
)。它告诉程序字符串的结束位置。
答案 2 :(得分:0)
这里* p是指向内存中某个位置的指针,它假定为1个字节(或字符)。所以它指向'h'字母。所以p[0] or *(p+0)
会给你一个p。但是,你的字符串以不可见的\0
字符结尾,因此当你使用printf函数时,它会输出所有符号,从*开始,其中* p指向,直到'\ 0'。
指针只是一个变量,它能够容纳一些地址(4,8或更多字节)。
答案 3 :(得分:0)
问题:
我还在Rithcie的书中了解到,指针变量并不具备数据类型。是真的???
简单地说,是的。
C中的数据类型用于在使用之前定义变量。变量的定义将为变量分配存储空间,并定义将在该位置保存的数据类型。
C具有以下基本内置数据类型。int,float,double,char
。
Pointer
是派生数据类型,每个数据类型都可以有一个与之关联的指针。指针没有关键字,但在变量和函数声明/定义中标有前面的*
。大多数编译器提供预定义的常量NULL,相当于0。
答案 4 :(得分:0)
如果p指向字符串,不应该只读取'h'??? 因为它只读取char的大小?为什么打印printf(“%s”,* p) 整个字符串???
将您的printf("%s", *p)
更改为printf("%c", *p)
即可看到您想要的内容。两者都根据格式说明符以字符串(%s
)或字符(%c
)的不同方式调用printf。
打印字符串使用printf("%s", p);
打印char使用printf("%c", *p);
Second Ans。 :指针拥有数据类型。这就是你使用char
* p的原因。