【问题标题】:Why is char *A able to hold strings while char A cannot?为什么 char *A 能够保存字符串而 char A 不能?
【发布时间】:2013-11-18 09:30:37
【问题描述】:

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

不应该像人物吗,只应该能抱人物。

【问题讨论】:

  • char* 是一个指向字符的指针。 char 是一个字符。
  • 字符串不是字符。字符串是一个字符序列。你的问题没有意义。
  • @EJP:字符串是一个字符序列,char* 只指向其中一个(第一个)。关键部分是字符序列以零结尾。因此,您只知道第一个但可以找到所有后续字符。 (而且这两个动作是 O(1) 和 O(N),所以绝对不同)。 +1 用于找出您的弦乐心智模型中缺少某些东西并询问它。

标签: c++ pointers char


【解决方案1】:

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

【讨论】:

  • 举一个“使用指针的代码”的具体例子:printf("Hello")相当于将指针传递给字符'H'printf。然而,尝试传递'H' 本身(如printf('H'))会出错,因为 printf 需要一个 const char 指针作为参数。 printf 假设字符串的其余部分 (ello) 在内存中跟随 H,直到它到达 \0,正如 SLaks 解释的那样。
【解决方案2】:

其实很简单:

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

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

查看此对话了解更多信息:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:
        char *a;
        

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

        恰恰相反:

        char a;
        

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

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

        【讨论】:

        • 可能 4 个字节,可能 ASCII。因此,通常的名称是 NTBS,即 Null Terminated Byte String。
        • 确实可能这就是我写“(取决于各种因素)”的原因
        【解决方案6】:

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

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

        char 类型大约只有一个字符:

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

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

        【讨论】:

          【解决方案7】:

          图片:

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

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

          【讨论】:

            【解决方案8】:

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

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

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

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2022-12-04
              • 1970-01-01
              • 2021-08-03
              • 2021-02-01
              • 2014-07-28
              • 2011-01-16
              • 1970-01-01
              相关资源
              最近更新 更多