【问题标题】:I am able to modify a constant string [duplicate]我能够修改一个常量字符串[重复]
【发布时间】:2015-06-05 11:37:59
【问题描述】:

为什么下面程序的输出是“pankaj”,我期待一个编译错误,比如“无法修改常量字符串”

#include<iostream>
using namespace std;

void fun(const char *a)
{
  a = "pankaj";
  cout  << a;
}

int main()
{
  const char *ptr = "GeeksforGeeks";
  fun(ptr);
  return 0;
}

【问题讨论】:

  • 你没有修改 string 你修改了 pointer 指向 string i> 使其指向不同的 string.

标签: c++


【解决方案1】:

在 C 函数中,参数是按值传递的。这意味着在fun() 中,您使用的是a 的副本,而不是原始变量。这意味着,您没有在fun() 中修改ptr。只有它是本地存储在a 中的副本。这个变量,即a,在fun()之外是不可见的,也没有对其进行任何修改。

现在,const char *a 意味着 a 是一个指针,指向内存中包含只读字符的位置。这意味着,您不能修改这些字符。但是,您可以修改 a 所指向的内容,这就是您正在做的事情。

【讨论】:

  • 您的第一个段落并不真正相关,因为它也可以修改原始变量
  • @MattMcNabb 这绝对没有我最初想象的那么重要。谢谢!不过我会离开那里。它已经以这种形式被投票,并且这个问题无论如何都被标记为[重复]。
【解决方案2】:

您没有修改任何字符串,只是修改了参数a
首先,它是指向传递值的指针,然后是指向程序中字符串常量的指针。
您不能更改传递的字符串数据,但更改指针就可以了。

【讨论】:

  • 如何更改字符串数据?你的意思是说我不能做像 *a = 'm' 这样的事情,而且 pankaj 不会被转换为“mankaj”?
  • 是的,你不能做类似*a = 'm' 这样的事情,因为这相当于更改const data
【解决方案3】:

ptr 是指向 char 数组的指针。 指针是const,但不是他指向的内容。 您可以通过以下方式更改内容:

ptr = "AnotherThing"

但是你不能改变指针指向的内存方向。

如果你尝试这个,你会得到一个错误:

*ptr = 'C';

【讨论】:

  • 指针不是常量。它指向的字符串是。更准确地说:const char * a 表示字符是常量,char * const a 表示指针是常量。
  • 知道了,谢谢...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多