能否为非const char指针及*argv创建const引用?代码报错求助
关于C++中指针引用的两个问题解答
问题1:能否拥有指向非const char指针的const引用?
当然可以,但你得先搞清楚引用的类型到底对应哪种const限定,这里很容易混淆两种不同的写法:
char* const&:这才是「指向非const char指针的const引用」——引用本身是const的,意味着你不能通过这个引用修改被引用的指针本身(比如不能让它指向别的地址),但依然可以通过指针修改它指向的非const char内容。
举个实际的例子:char* p = new char[5]{"test"}; char* const& r = p; // 合法:通过指针修改指向的内容 *r = 'T'; // 非法:不能修改引用指向的指针本身 // r = new char[3]{"abc"};- 而你代码里用的
const char*&是「指向const char指针的引用」,它要求绑定的对象本身就是const char*类型,不能直接绑定char*——因为char*隐式转换为const char*会产生一个临时对象,C++不允许非const引用绑定临时对象,这就是你报错的核心原因。
问题2:能否拥有指向*argv的const引用并遍历argv指针数组?
首先,argv是char*[]类型(函数参数中会退化为char**),*argv就是第一个命令行参数的char*指针。如果想绑定它的const引用,你需要用char* const&而不是const char*&。不过说实话,遍历字符串的时候根本不需要用引用——直接用指针就足够清晰,还不会有类型匹配的问题。
你的代码为什么报错?
你写的循环:
for (const char *& c = *argv; *c != '\0'; ++c)
这里*argv是char*类型,要绑定到const char*&的话,相当于先把char*转成const char*临时对象,再绑定到非const引用,这违反了C++的引用初始化规则,所以编译器会抛出「cannot convert from 'char *' to 'const char *&'」的错误。
修正后的代码
如果你只是想遍历第一个命令行参数的每个字符,最简单的写法是直接用const char*:
#include <iostream> using std::cout; using std::endl; int main (int argc, char * argv []) { // 先判断argc >=1,避免空指针访问 if (argc < 1) return 1; // 用const char*直接接收*argv,隐式转换合法 for (const char *c = *argv; *c != '\0'; ++c) { cout << *c << endl; } return 0; }
如果一定要用引用,可以改成char* const&(因为我们不需要修改指针本身,只是遍历字符):
#include <iostream> using std::cout; using std::endl; int main (int argc, char * argv []) { if (argc < 1) return 1; char* const& c_ref = *argv; for (const char *c = c_ref; *c != '\0'; ++c) { cout << *c << endl; } return 0; }
另外,如果你的目标是遍历所有命令行参数(而不是第一个参数的字符),写法应该是这样:
#include <iostream> using std::cout; using std::endl; int main (int argc, char * argv []) { // 遍历argv数组,从第一个参数到最后一个 for (int i = 0; i < argc; ++i) { cout << "参数" << i << ": " << argv[i] << endl; // 嵌套遍历每个参数的字符 for (const char* c = argv[i]; *c != '\0'; ++c) { cout << "- " << *c << endl; } } return 0; }
内容的提问来源于stack exchange,提问作者Alzeon
相关产品推荐
相关产品推荐

