I am having trouble understanding why a character pointer is able to hold a string.
Shouldn't it be like character, only should be able to hold a character.
假设字符指针指向字符串的开头。
指针本身指向字符串中的第一个字符,使用该指针的代码假定字符串的其余部分在内存中跟随它,直到它到达一个\0
.
图片:
+---+---+---+----+------
| A | B | C | \0 | ???
+---+---+---+----+------
^
|---char*
是的,每个一次char*
只能指向一个字符。但是 C++ 字符串之类"ABC"
的字符串作为连续序列存储在内存中,没有空洞,末尾有一个 0 字符。因此,如果您有指向“A”++pointer
的指针,您将获得指向“B”的指针。而且你也知道你可以做到,++
直到你找到最后一个'\0'
。(这正是strlen("ABC")
- 使用++
3 次找到 0,所以它返回 3。)
字符指针除了地址之外什么都不保存。此地址是 char 数组的第一个元素的地址(或至少是)。本质上char*
是一样的char[]
另一方面,char 是一种值类型,不能容纳超过一个字节。
char *a;
是指向字符的指针(也称为地址/位置,表示为数字)。这意味着 is 本身不包含字符串(字符序列)。事实上char *a的大小(取决于各种因素)是 4 个字节。这样的变量可能指向您的字符串实际所在的实际位置(其第一个字符后跟其他字符并以 0 终止)。在 C/C++ 中,它将被称为 ASCIIZ,即。以零结尾的字符序列。
与此相反:
char a;
是一个变量(通常为 8 位),仅存储一个字符(纯 ASCII 字符 - 不是 unicode 代码点等)
更新: 当然下面的 MSalters 是正确的 - 字符串可能只包含任何内容,即。可以由 char 可以保存的任何值组成,并且它没有(尽管通常是)被解释为 ASCII。
在 C 语言中,(以空结尾的)字符串在内存中以字符的顺序存储单元(它们的字节 - 但我不会让它在字节对齐等方面变得更复杂)表示,最后一个连续字符是 '\0' (终止):
char* str = "test"; -----> |t|e|s|t|\0|
char
type 大约只有一个字符:
char ch = 'a'; -----> |a|
现在,在 C++ 中,您可以使用 C 风格的字符串(char*
类型)或string
标准库的类。
将字符串“abc”视为Char
“a”、“b”和“c”的列表,Char A
是类型的变量,Char
不能表示字符串“abc”。Char *A
是一个类型的指针Char
,它可以指向一个Char
类型变量。Char *A
可用于指向字符串的第一个元素,在本例中为“a”。
其实很简单:
char *A 是一个字符指针。这是初始化字符数组的另一种方式,这就是字符串。
另一方面,char A 是单个字符。它不能超过一个字符。
有关更多信息,请参阅此对话:
##char数组或char指针不保存字符串,只指向基地址##
字符串是按顺序存储在内存位置中的字符的联合。因此,如果第一个字符的内存地址已知,我们可以通过增加内存地址(通过数据类型占用的大小。在本例中为 1 个字节)来知道其他地址。
字符串是一个 char 数组,数组的名称指向存储第一个字符的内存地址(基地址)。字符串函数通过操纵该内存地址来工作(不确定,但我想不出任何其他方式)。
另一方面,char 指针也指向字符的内存位置。因此可以通过字符串函数以相同的方式使用。
因此可以使用 char 数组或 char 指针来声明字符串...