10

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.

4

8 回答 8

19

假设字符指针指向字符串的开头
指针本身指向字符串中的第一个字符,使用该指针的代码假定字符串的其余部分在内存中跟随它,直到它到达一个\0.

于 2013-11-06T22:21:41.633 回答
9

图片:

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

是的,每个一次char*只能指向一个字符。但是 C++ 字符串之类"ABC"的字符串作为连续序列存储在内存中,没有空洞,末尾有一个 0 字符。因此,如果您有指向“A”++pointer的指针,您将获得指向“B”的指针。而且你也知道你可以做到,++直到你找到最后一个'\0'。(这正是strlen("ABC")- 使用++3 次找到 0,所以它返回 3。)

于 2013-11-06T22:59:32.367 回答
3

字符指针除了地址之外什么都不保存。此地址是 char 数组的第一个元素的地址(或至少是)。本质上char*是一样的char[]

另一方面,char 是一种值类型,不能容纳超过一个字节。

于 2013-11-06T22:22:35.307 回答
1
char *a;

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

与此相反:

char a;

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

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

于 2013-11-06T22:40:42.227 回答
1

在 C 语言中,(以空结尾的)字符串在内存中以字符的顺序存储单元(它们的字节 - 但我不会让它在字节对齐等方面变得更复杂)表示,最后一个连续字符是 '\0' (终止):

char* str = "test"; -----> |t|e|s|t|\0|

chartype 大约只有一个字符:

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

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

于 2013-11-06T22:56:03.487 回答
0

将字符串“abc”视为Char“a”、“b”和“c”的列表,Char A是类型的变量,Char不能表示字符串“abc”。Char *A是一个类型的指针Char,它可以指向一个Char类型变量。Char *A可用于指向字符串的第一个元素,在本例中为“a”。

于 2013-11-06T22:38:52.493 回答
0

其实很简单:

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

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

有关更多信息,请参阅此对话:

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

于 2013-11-06T22:21:51.057 回答
0

##char数组或char指针不保存字符串,只指向基地址##

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

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

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

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

于 2020-04-07T21:22:06.100 回答