为什么不能将数组名作为指针引用传递?C++编译报错问题求解
问题核心原因
你遇到的编译错误本质是数组类型与指针类型的差异 + 右值无法绑定非const左值引用两个规则共同导致的:
- 你定义的
char long_txt[] = "twas\n\nbrillig..."是char[N]类型的数组变量,而非char*类型的指针变量。数组名确实会在传参等场景下隐式退化为指向数组首元素的指针,但这个退化生成的是一个临时的指针值,属于右值,没有可修改的内存空间。 - 你的
get_line第一个参数声明为char *&txt,是char*类型的非const左值引用,要求必须传入一个可修改的char*左值变量(也就是有明确内存地址、可以被赋值的指针变量)。临时右值显然不符合这个要求,所以编译器报错。
额外提醒:就算没有编译错误,你也不能修改数组名本身的值——数组的首地址是固定的常量,不支持自增、赋值操作,你原本想通过传数组名来移动读取指针的逻辑本身就是不成立的。
修复方案
你只需要额外声明一个独立的char*指针变量指向数组首地址,把这个指针传给get_line即可:
int main() { char long_txt[] = "twas\n\nbrillig\nand the\n\n\nslithy"; int ret; char *dest; char* p_txt = long_txt; // 声明独立的可修改左值指针 while (*p_txt) { ret = get_line(p_txt, dest); printf("%d %s %s\n", ret, dest, p_txt); } }
修改后函数内部对txt的自增操作会直接作用到p_txt变量上,完全符合你设计函数时模仿std::getline移动读取位置的需求。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

