我无法理解为什么字符指针能够容纳字符串。
不应该像角色一样,只能拥有一个角色。
答案 0 :(得分:11)
假设Char指针指向字符串的开头
指针本身指向字符串中的第一个字符,使用指针的代码假定字符串的其余部分在内存中跟随它,直到它到达\0
。
答案 1 :(得分:3)
除地址外,字符指针不包含任何内容。
该地址是char数组的第一个元素(或至少可以是)。
实质上char*
与char[]
另一方面,char是一种值类型,不能容纳多个字节。
答案 2 :(得分:2)
照片:
+---+---+---+----+------
| A | B | C | \0 | ???
+---+---+---+----+------
^
|---char*
是的,每个char*
一次只能指向一个字符。但是像"ABC"
这样的C ++字符串作为连续序列存储在内存中,没有空洞,最后有一个0字符。因此,如果你有指向'A'的指针,++pointer
会得到指向'B'的指针。并且您还知道,在找到最后++
之前,您可以执行'\0'
。 (这正是strlen("ABC")
所做的 - 使用++
3次来找到0,所以它返回3.。
答案 3 :(得分:1)
char *a;
是字符的指针(也称为数字的地址/位置)。这意味着它本身不包含字符串(字符序列)。实际上 char * a 的大小(取决于各种因素)是4个字节。这样的变量可能指向字符串实际所在的实际位置(其第一个字符后跟其他字符并以0结尾)。在C / C ++中,它将被称为ASCIIZ即。字符序列以零结尾。
恰恰相反:
char a;
是一个变量(通常为8位),只存储一个字符(纯ASCII字符 - 不是unicode代码点等)
<强>更新强> 当然下面的MSalters是正确的 - 字符串可能只包含任何东西,即。可以由char可以容纳的任何值组成,并且这些值(尽管通常是)被解释为ASCII。
答案 4 :(得分:0)
实际上很简单:
char * A是一个字符指针。它是初始化字符数组的另一种方式,就是字符串。
另一方面,char A是一个char。它不能超过一个字符。有关详细信息,请参阅此对话:
答案 5 :(得分:0)
将字符串“abc”视为Char
“a”,“b”和“c”的列表,Char A
是Char
类型的变量,它不能表示字符串“ ABC”。 Char *A
是Char
类型的指针,它可以指向Char
类型变量。 Char *A
可用于指向字符串的第一个元素,在本例中为“a”。
答案 6 :(得分:0)
在C中,(空终止)字符串在字符的连续内存单元格中存储在内存中(它们的字节 - 但我不会在字节对齐等方面使其更复杂),最后一个连续字符'\ 0'(终止):
char* str = "test"; -----> |t|e|s|t|\0|
char
类型仅限一个字符:
char ch = 'a'; -----> |a|
现在,在C ++中,您可以使用C风格的字符串(char*
类型)或标准库的string
类。
答案 7 :(得分:0)
## char数组或char指针不保存字符串,而仅指向基地址##
字符串是顺序存储在“存储位置”中的字符的并集。因此,如果第一个字符的内存地址是已知的,我们可以通过增加内存地址(通过数据类型占用的大小,在这种情况下为1字节)来知道其他地址。
一个字符串是一个char数组,一个数组的名称指向存储第一个字符的内存地址(基地址)。字符串函数通过操纵内存地址(不确定(但我无法想到任何其他方式))来工作。。
另一方面,一个char指针也指向一个字符的存储位置。 因此可以通过字符串函数以相同的方式使用。
因此可以使用char数组或char指针声明字符串...