为什么char *A可以保存字符串而char A不能?

11
我不理解为什么字符指针能够存储字符串,应该只有单个字符才对。

6
char* 是指向字符的指针。char 是一个字符。 - David G
一个字符串不是一个字符。一个字符串是一系列的字符。你的问题没有意义。 - user207421
@EJP:字符串是字符序列,而char*只指向其中一个(第一个)。关键部分在于字符序列以零结尾。因此,您只知道第一个字符,但可以找到所有后续字符。(这两个操作分别为O(1)和O(N),因此肯定不同)。+1,因为您发现了字符串的心理模型中缺少某些内容,并进行了提问。 - MSalters
8个回答

20

字符指针被假定指向字符串的开头
指针本身指向字符串中的第一个字符,并且使用该指针的代码假定其后的字符串在内存中跟随它,直到到达\0为止。


给出“使用指针的代码”的具体例子:printf(“Hello”)等同于将指向字符'H'指针传递给printf。而尝试传递'H'本身,如在printf('H')中,会产生错误,因为printf期望参数是一个const char指针。printf假定字符串的其余部分(ello)在内存中跟随H,直到它达到\0,正如SLaks所解释的那样。 - Matthew Thomas

9

图片:

+---+---+---+----+------
| A | B | C | \0 | ???
+---+---+---+----+------
  ^
  |---char*

是的,每个char*一次只能指向一个字符。但C++字符串,如"ABC"在内存中是一个连续的序列,没有孔和以0结尾的字符。因此,如果您有指向'A'的指针,++pointer将得到指向'B'的指针。还知道您可以使用++,直到找到最后一个'\0'。(正是strlen("ABC")所做的 - 使用++ 3次来查找0,因此它返回3。)

3

一个字符指针除了地址外不持有任何内容。这个地址是char数组的第一个元素(至少可以这么说)。实质上,char*char[]是相同的。

另一方面,char是值类型,无法保存多于一个字节的内容。


1
char *a;

指针(也称为表示为数字的地址/位置)指向一个字符。这意味着它本身不包含字符串(字符序列)。事实上,char *a的大小(取决于各种因素)为4字节。这样的变量可以指向实际位置,那里是您的字符串所在的地方(其第一个字符后跟其他字符,并以0结尾)。在C/C++中,它将被称为ASCIIZ,即由零终止的字符序列。

相反,这个:

char a;

变量(通常为8位)仅存储一个字符(普通ASCII字符-不是Unicode代码点等)

更新: 当然,下面的MSalters是正确的-字符串可以包含任何内容,即可以由char可以保存的任何值组成,并且这不必(尽管通常如此)被解释为ASCII。


大概是4个字节,大概是ASCII码。因此通常称为NTBS,即Null Terminated Byte String。 - MSalters
确实可能这就是为什么我写了“(取决于各种因素)”。 - Artur

0

##字符数组或字符指针仅指向基地址,而不是存储字符串##

字符串是按顺序存储在内存位置中的字符集合。因此,如果已知第一个字符的内存地址,我们可以通过增加(数据类型占用的大小,在这种情况下为1字节)内存地址来知道其他地址。

字符串是一个字符数组,数组的名称指向存储第一个字符的内存地址(基地址)。字符串函数通过操作该内存地址来工作(不确定,但我想不到其他方法)

另一方面,字符指针也指向字符的内存位置。因此,字符串函数可以通过相同的方式使用它们。

因此,可以使用字符数组或字符指针声明字符串...


0

其实很简单:

char *A 是一个字符指针。这是初始化字符数组的另一种方式,而字符串就是由字符数组组成的。

另一方面,char A 是一个单个字符。它不能超过一个字符。

查看此对话以获取更多信息:

http://www.cplusplus.com/forum/beginner/13343/


0

将字符串"abc"视为由Char"a"、"b"和"c"组成的列表,Char AChar类型的变量,不能表示字符串"abc"。 Char *AChar类型的指针,可以指向Char类型的变量。Char *A可用于指向字符串的第一个元素,在此情况下为"a"。


0
在C语言中,(以null结尾的)字符串在内存中以字符的顺序存储在连续的内存单元中(它们的字节 - 但我不会让它更复杂,比如字节对齐等),最后一个连续字符是'\0'(终止符):
char* str = "test"; -----> |t|e|s|t|\0|

char类型只涉及一个字符:

char ch = 'a'; -----> |a|

现在,在C++中,你可以使用C风格的字符串(char*类型)或标准库的string类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接