2017-06-19 198 views
3

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

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. 
+0

这不是有效的C,它是C++。在* both *语言中,你做错了......指针's'是一个指向*只读*(在C++中为'const')字符数组的指针,所以's'应该是'const char * s =“test string”;' –

+0

哦,好吧!我很抱歉,我正在尝试使用g ++进行编译。让我改变标题。 –

+0

在Prog 2中没有定义tmp? –

回答

2

printMe需要一个左值参照一个可变指针为const焦炭。

在第一个示例中,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"); 
} 

才不是。创建一个临时对象,并且对非const对象的引用不能绑定到临时对象。

+0

谢谢@Miles澄清。你能告诉我一下'const char *&'和'const char *'和'const char&'之间的区别吗? –

+0

它们分别是:对const char指针的引用,对const char的指针以及对const char的引用。指针是存储内存地址的完整对象,而引用在概念上只是现有对象的新名称。参见[C++中指针变量和引用变量之间的区别是什么?](https://stackoverflow.com/questions/57483/what-are-the-differences-between-a-pointer-variable-and-a -reference-variable-in)以获取更多信息。 –

+0

非常感谢@Miles! –

相关问题