【问题标题】:Assigning string literal to pointer to const char将字符串文字分配给指向 const char 的指针
【发布时间】:2013-06-18 04:24:26
【问题描述】:

我可以知道为什么这个任务是可能的吗?

char const *c = "Hello";
c = "there!";

是不是指向了一个内容不能修改的位置。据我所知,它正在创建另一个对象并使 c 指向它。是不是真的。

对此的任何其他亮点将不胜感激。

【问题讨论】:

  • 你不是在修改*c的内容;您正在指向一个新的(且不可更改的)位置...
  • c 是一个指向不可修改字符的指针……没有理由不能指向不同的不可修改字符。 “它正在创建另一个对象”——不是真的;字符串文字已经在内存中(它在程序加载时加载),这只是将c 设置为它的地址。

标签: c++ c


【解决方案1】:

就像许多答案已经说明const char *c 如下:

c 是一个指向 const char 的指针

如果你不熟悉指针,指针会保存内存中某个“对象”的地址。

你的两个字符串,“Hello”和“there!”是字符串文字。在编译时(减去编译器优化),它们被放置在代码的 text/rodata 段中。不确定您是否熟悉内存中可执行文件的布局(也称为运行时环境),但您有 Text、Data、BSS、Heap 和 Stack。

在运行时,char 指针被分配在堆栈上,首先被设置为指向字符串“Hello”所在的内存区域,然后在您的第二条语句中,指针被设置为指向“there! "

这两个字符串实际上都是内存中连续的字节块,您的指针只是指向一个的开头,然后指向另一个。

因此,即使看起来您是在堆栈上创建这些字符串,但实际上并非如此。

另一方面,如果您已将字符串声明如下,

char ch[] = "Hello";

那么您无法重新分配 ch 以指向“那里”,因为在这种情况下 ch 是 non-modifialble l-value

这超出了您的问题范围,但希望它可以帮助您更多地了解代码在后台的样子。

【讨论】:

    【解决方案2】:

    是的,const 适用于它左边的任何东西(除非它左边没有任何东西)。

    您只是将c 指向不同的字符串。

    【讨论】:

    • 不,const 适用于它左边的任何东西,除非它左边没有任何东西,在这种情况下它适用于它右边的任何东西。在这种情况下,const 适用于 char,而不是 *
    【解决方案3】:

    从右到左阅读以正确解释声明:c 是指向常量 char 的指针。

    【讨论】:

      【解决方案4】:

      char const *c = "Hello"; 是一个指向常量的指针。表示该指针指向的内容不能修改,但可以修改指针指向不同的内存位置。

      注意“Hello”是一个字符串文字。即使给出了char *c = "Hello";,尝试修改内容也是未定义的行为。即c[0] = 'x'

      【讨论】:

        【解决方案5】:
        char const *c = "Hello";
        

        这是一个指向常量的指针,

        不是常量指针 char * const c = "Hello";

        如果指针 to 常量,则不能使用指针更改指向的值 比如*c[3] = 't';等等。

        在常量指针的情况下,您无法更改指针指向的内容。 像这样,

        c = "there!";
        

        也见this

        【讨论】:

          【解决方案6】:

          当你编码时

                 char const* c1 = "Hello";
          

          “Hello”将存储在只读内存中(字符串文字进入只读内存),指针 c1 将存储在堆栈中。

          所以只读内存中的字符串(如本例中的“Hello”)无法修改,但是可以让 C1 指向存储在只读内存中的其他字符串。

          这就是你在第二行代码中所做的。

          另外,只需删除 const 关键字即可尝试相同的操作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-02
            • 2017-01-18
            • 2014-08-23
            • 1970-01-01
            • 1970-01-01
            • 2021-03-09
            • 2021-04-15
            相关资源
            最近更新 更多