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