为什么char * A能够保持字符串而char A不能?

时间:2013-11-06 22:19:57

标签: c++ pointers char

我无法理解为什么字符指针能够容纳字符串。

不应该像角色一样,只能拥有一个角色。

8 个答案:

答案 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。它不能超过一个字符。

有关详细信息,请参阅此对话:

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

答案 5 :(得分:0)

将字符串“abc”视为Char“a”,“b”和“c”的列表,Char AChar类型的变量,它不能表示字符串“ ABC”。 Char *AChar类型的指针,它可以指向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指针声明字符串...