【问题标题】:C++ pointer passed by reference [duplicate]通过引用传递的C ++指针[重复]
【发布时间】:2022-01-16 05:48:26
【问题描述】:

以下代码无法编译:

void function(const char*& i){
   // do something
}

int main() {
    char a = 'a';
    char *p = &a;
    function(p);
    return 0;
}

谁能给我解释一下为什么? 代码在做什么?主函数中的代码将一个普通的指向 char 的指针传递给指向一个常量 char 的指针。

据我所知,只要传递的指针在函数中没有被违反,就应该允许调用。

指向char的普通指针的地址和值可以被修改,因此如果通过引用传递给唯一参数是指向常量char的指针的函数,则不能违反这样的指针,因为这样的指针只能修改其地址, 并且不违反指向 char 的普通指针的限制。

编辑: 它不编译的原因是当 char* 转换为 const char* 时,它会产生一个 const char* 类型的右值。在 C++ 中,非常量引用不能附加到右值。 所以解决方案就是简单地通过添加 const 来使引用常量为参数提供类型常量指针 ... 到一个常量。

void function(const char* const& i){
   // do something
}

int main() {
    char a = 'a';
    char *p = &a;
    function(p);
    return 0;
}

【问题讨论】:

  • 有人会说“指向常量的指针应该只存储常量字符的地址”,这很有道理,但是在上面的代码中,我只需要删除与符号即可启用要编译的代码。所以按值传递可以正常工作。此外,如果参数是 const char* const& 或 char*const&,代码也可以正常编译。
  • 你的函数需要一个const char*类型的指针,但你传递给它的是一个非常量char*。这意味着p 应该是const char* 类型。
  • 如果您确实发布了编译器错误,这将有所帮助。
  • "cannot convert argument 1 from 'char *' to 'const char *&'" 是来自 CLion 的错误信息,但我的问题是为什么?
  • “const char*&”类型的引用不能用“char*”类型的值初始化,但“const char* const&”类型的引用可以用类型的值初始化“字符 *” 。我的问题是为什么?

标签: c++ pointers reference


【解决方案1】:

你所做的和你做的没什么不同

const char* function(){
   return "const char*";
}

int main() {
    char *p = function(); // not compile
}

让非常量char* 指向一个常量显然是错误的


重新评论:这显然是非常不同的。 const char*& 的意思是“我不会修改传递给我的 char 指针的值”

NO不代表(godbolt

void function(const char*& i){
   i = "const char*"; // compiles fine
}

int main() {
    const char *p;
    function(p);
}

【讨论】:

  • 嗨。感谢您的回答。这显然是非常不同的。 “const char*&”表示“我不会修改传递给我的 char 指针的值”。这本质上意味着 const char*& 不会违反函数中指向 char 的普通指针。如果您在上面的代码中按值传递 char*,它就可以工作。但如果你通过引用传递,它就不起作用。为什么?
  • @justastar 不,这并不意味着,请参阅更新的答案。
  • @justastar 这样吗?如果您可以传递char* p,那么您现在有p 指向常量字符串文字。这显然是错误的。这怎么不能回答你的问题?
  • 祝您有美好的一天,感谢您的宝贵时间。
【解决方案2】:

你可以通过查看编译器产生的错误来找出问题所在:

无法将“const char*&”类型的非常量左值引用绑定到“const char*”类型的右值

函数签名:

void function(const char*& i)

告诉编译器函数接收到一个指向 const char 的指针的引用,而你给它一个指向一个指向 char 的 const 指针的引用,所以你需要把它写成:

void function(const char* const& i)

您可能想了解the spiral rule

【讨论】:

  • 我真的很难理解你的答案。我的问题是,为什么上面的代码没有编译? const char* 是指向常量的指针。因此它承诺不会修改分配给它的任何指针的值,同时能够修改地址。 char* 指针可以修改其值或地址。那么为什么这是一个问题呢?那是我的问题。我已经知道 const char* const& 工作正常。
  • 因为您传递给函数的char* 必须是常量,而事实并非如此。
  • 我知道 const char*& 会起作用。这很明显。我只是问为什么在这种特殊情况下它不起作用。
  • 我认为您对const char*&char* const& 之间的区别感到困惑。在前者中,char 是 const。在后者中,指针是 const。您的函数应该将(const 指针)指向char,而不是给它一个指向(const char)的指针。因此,在我的回答中,第一个 const 用于 char(不是必需的),第二个用于指针。
  • 我正在传递一个指向 char (char*) 的普通指针。
猜你喜欢
  • 2016-08-26
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 2020-03-14
相关资源
最近更新 更多