字符指针被假定指向字符串的开头。
指针本身指向字符串中的第一个字符,并且使用该指针的代码假定其后的字符串在内存中跟随它,直到到达\0
为止。
printf(“Hello”)
等同于将指向字符'H'
的指针传递给printf
。而尝试传递'H'
本身,如在printf('H')
中,会产生错误,因为printf
期望参数是一个const char指针。printf
假定字符串的其余部分(ello
)在内存中跟随H
,直到它达到\0
,正如SLaks所解释的那样。 - Matthew Thomas图片:
+---+---+---+----+------
| A | B | C | \0 | ???
+---+---+---+----+------
^
|---char*
char*
一次只能指向一个字符。但C++字符串,如"ABC"
在内存中是一个连续的序列,没有孔和以0结尾的字符。因此,如果您有指向'A'的指针,++pointer
将得到指向'B'的指针。还知道您可以使用++
,直到找到最后一个'\0'
。(正是strlen("ABC")
所做的 - 使用++
3次来查找0,因此它返回3。)一个字符指针除了地址外不持有任何内容。这个地址是char数组的第一个元素(至少可以这么说)。实质上,char*
与char[]
是相同的。
另一方面,char是值类型,无法保存多于一个字节的内容。
char *a;
指针(也称为表示为数字的地址/位置)指向一个字符。这意味着它本身不包含字符串(字符序列)。事实上,char *a的大小(取决于各种因素)为4字节。这样的变量可以指向实际位置,那里是您的字符串所在的地方(其第一个字符后跟其他字符,并以0结尾)。在C/C++中,它将被称为ASCIIZ,即由零终止的字符序列。
相反,这个:
char a;
变量(通常为8位)仅存储一个字符(普通ASCII字符-不是Unicode代码点等)
更新: 当然,下面的MSalters是正确的-字符串可以包含任何内容,即可以由char可以保存的任何值组成,并且这不必(尽管通常如此)被解释为ASCII。
##字符数组或字符指针仅指向基地址,而不是存储字符串##
字符串是按顺序存储在内存位置中的字符集合。因此,如果已知第一个字符的内存地址,我们可以通过增加(数据类型占用的大小,在这种情况下为1字节)内存地址来知道其他地址。
字符串是一个字符数组,数组的名称指向存储第一个字符的内存地址(基地址)。字符串函数通过操作该内存地址来工作(不确定,但我想不到其他方法)。
另一方面,字符指针也指向字符的内存位置。因此,字符串函数可以通过相同的方式使用它们。
因此,可以使用字符数组或字符指针声明字符串...
其实很简单:
char *A 是一个字符指针。这是初始化字符数组的另一种方式,而字符串就是由字符数组组成的。
另一方面,char A 是一个单个字符。它不能超过一个字符。
查看此对话以获取更多信息:
将字符串"abc"视为由Char
"a"、"b"和"c"组成的列表,Char A
是Char
类型的变量,不能表示字符串"abc"。 Char *A
是Char
类型的指针,可以指向Char
类型的变量。Char *A
可用于指向字符串的第一个元素,在此情况下为"a"。
char* str = "test"; -----> |t|e|s|t|\0|
char
类型只涉及一个字符:
char ch = 'a'; -----> |a|
char*
类型)或标准库的string
类。
char*
是指向字符的指针。char
是一个字符。 - David Gchar*
只指向其中一个(第一个)。关键部分在于字符序列以零结尾。因此,您只知道第一个字符,但可以找到所有后续字符。(这两个操作分别为O(1)和O(N),因此肯定不同)。+1,因为您发现了字符串的心理模型中缺少某些内容,并进行了提问。 - MSalters