【问题标题】:Re-assigning a string to character pointer in C or C++在 C 或 C++ 中将字符串重新分配给字符指针
【发布时间】:2021-01-21 16:01:04
【问题描述】:

可能是我对指针的概念不清楚,但我有疑问。对于整数指针

# include <stdio.h>
int main()
{
int a = 4;
int *b = &a;
*b = 6;
printf("%d", *b);
}

打印

6

但对于字符指针

char *str = "Hello";
*str = "Hlw";

报错 但是

char *str = "Hello";
str = "Hlw";

有效。那么,为什么会这样呢?

【问题讨论】:

  • 给出错误但是 -- 您应该发布给出的错误消息并告诉我们您遇到的错误消息中的什么问题。
  • No errors 只是警告。这些都表达得很清楚。
  • 后者不是正确的 C++。

标签: c++ c pointers variable-assignment string-literals


【解决方案1】:

*b 可以替换为b[0],因为在 C 中,指向任何东西的指针也是该类型的一个元素的数组。这样做有助于理解问题:

int a = 4;
int *b = &a;
b[0] = 6;       //<=== this is correct because b is an array of int

char *str = "Hello";
str[0] = "Hlw"; //<=== but this is not as explained by other answers

【讨论】:

    【解决方案2】:

    指针不知道它们是指向单个对象还是指向数组的成员。

    在这段代码中sn-p

    int *b = &a;
    *b = 6;
    

    指针p 指向int 类型的对象,因此解除对指针的引用将获得对该对象的访问权。

    在这段代码中sn-p

    char *str = "Hello";
    *str = "Hlw";
    

    指针str 指向char 类型的对象。它指向字符串文字"Hello" 的第一个字符。因此,解除对指针的引用,您将可以访问指针所指向的字符串文字的第一个字符。

    因此而不是这个不正确的分配

    *str = "Hlw";
    

    左侧操作数的类型为 char 而右侧操作数的类型为 C 中的 char[4] 和 C++ 中的 const char[4],您应该编写类似的内容

    *str = 'G';
    

    也就是说,您可以将字符文字分配给char 类型的对象。您不能将字符串文字分配给 char 类型的对象,例如

    char c = "Hello";
    

    而表达式*str 确实具有char 类型。

    在这段代码中sn-p

    char *str = "Hello";
    str = "Hlw";
    

    您正在重新分配指针 str 本身,而不是它指向的对象。

    在声明之后,指针 str 指向字符串文字 "Hello" 的第一个字符,即字符 'H'

    在以下语句中,指针str 由字符串文字"Hlw" 的第一个字符的地址重新分配。那个 ijs 现在它指向这个字符串文字的字符 'H'

    【讨论】:

      【解决方案3】:

      字符串字面量是一个const char[] 数组,它衰减成一个const char* 指针,指向字符串的第一个char

      char *str = "Hello"; 在 C 和 C++ 至 C++03 中是合法的,但在 C++11 及更高版本中是非法的。现代版本不允许将 const char* 指针分配给非常量 char* 指针(没有显式类型转换,anyay)。

      正如int* 示例中的*b 访问单个int*str 也访问单个char。所以*str = "Hlw"; 试图将const char* 指针分配给单个char,这就是它无法编译的原因。

      str = "Hlw"; 只是将const char* 指针分配给str,使其指向不同的内存地址(如果这是合法的)。就您的int* 示例而言,这与执行此操作相同:

      int a;
      int *b = &a;
      int c;
      b = &c; // <--
      

      【讨论】:

      • 所以,当我写*str = "hlw" 时,它会将字符串的起始地址分配给*s,这是不正确的s = "hlw"但如果我们只将起始地址分配给str就可以了
      • @AdityaKomawar 是的
      【解决方案4】:

      当您通过int* 间接访问时,您将获得int 的左值。 int 是一个整数。

      当您通过char* 间接访问时,您将获得char 的左值。 char 不是字符串。它是单个字符(假设是固定宽度的字符编码而不是 unicode)。

      这里的核心区别在于字符串是字符数组,而整数不是数组。

      str = "Hlw";
      

      这在 C++ 中是不正确的,因为字符串字面量是一个 const char 数组,并且这样的数组不会隐式转换为指向非 const char 的指针。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 2013-12-26
        • 1970-01-01
        相关资源
        最近更新 更多