【问题标题】:convert char* to const char* in C++在 C++ 中将 char* 转换为 const char*
【发布时间】:2017-06-19 18:06:44
【问题描述】:

如何在 C++ 中将char* 转换为const char*?为什么程序 1 可以工作,而程序 2 不能?

Prog 1(工作):

char *s = "test string";
const char *tmp = s;
printMe(tmp);

void printMe(const char *&buf) {
    printf("Given Str = %s", buf);
}

Prog 2(不工作)

char *s = "test string";
printMe((const char *)s);     // typecasting not working

void printMe(const char *&buf) {
    printf("Given Str = %s", buf);
}

我收到的错误:

x.cpp:10:15: warning: conversion from string literal to 'char *' is 
deprecated [-Wc++11-compat-deprecated-writable-strings]
char *s = "test string";
          ^
x.cpp:12:5: error: no matching function for call to 'printMe'
printMe(s);
^~~~~~~
x.cpp:6:6: note: candidate function not viable: no known conversion 
from 'char *' to 'const char *&' for 1st argument
void printMe(const char *&buf)
 ^
1 warning and 1 error generated.

谢谢。

【问题讨论】:

  • 那不是有效的 C,它是 C++。而在 both 语言中,你做错了......指针s 是一个指向只读(C++ 中为const)字符数组的指针,所以s 应该是const char *s = "test string";
  • 哦,好吧!对不起,我正在尝试使用 g++ 进行编译。让我改一下标题。
  • Prog 2 中没有定义 tmp?
  • 我认识@some 程序员老兄。但我想知道有没有办法将 char * 转换为 const char * 或反之亦然?
  • const char &buf, & 表示它绑定到一个变量,在第一种情况下它是 tmp。在第二种情况下,由于您没有 tmp,它无法将 char 转换为有界变量。如果 printMe 所做的只是 printf,则不需要 const char*& buf,只需要 const char* buf。

标签: c++ pointers casting reference constants


【解决方案1】:

printMe 将左值引用指向指向 const char 的可变指针。

在您的第一个示例中,tmp 是指向 const char 的可变指针类型的左值,因此可以毫无问题地将引用绑定到它。
在您的第二个示例中,(const char*)s 创建了一个临时的 const char* 对象。对可变对象的左值引用不能绑定到临时对象,因此会出现错误。如果您将printMe 更改为const char* const&,则无论是否使用显式强制转换,调用都会成功。

void printMe(const char * const& buf) {
    printf("Given Str = %s", buf);
}

int main() {
    char s[] = "test string";
    printMe(s);
}

Live on Coliru

当然,如果您不想更改传递给printMe 的对象(指针),那么根本没有理由使用引用。只需发送const char*

void printMe(const char * buf) {
    printf("Given Str = %s", buf);
}

int main() {
    char s[] = "test string";
    printMe(s);
}

Live on Coliru

最后,这也是同样的原因:

void doSomething(const std::string& s) {}
int main() {
    doSomething("asdf");
}

在此期间工作:

void doSomething(std::string& s) {}
int main() {
    doSomething("asdf");
}

没有。创建了一个临时对象,并且对非常量对象的引用无法绑定到该临时对象。

【讨论】:

  • 感谢@Miles 的澄清。你能告诉我const char *&const char *const char &之间的区别吗?
  • 它们分别是:对指向 const char 的指针的引用、指向 const char 的指针和对 const char 的引用。指针是存储内存地址的成熟对象,而引用在概念上只是现有对象的新名称。请参阅What are the differences between a pointer variable and a reference variable in C++? 了解更多信息。
  • 非常感谢@Miles!
猜你喜欢
  • 2013-12-31
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2014-10-22
  • 2019-11-11
  • 2020-08-04
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多