在单独的函数中修改指向字符串文字的指针
Modifying pointer to string literal in separate function
我有一个小问题,希望有人能用比我已经遇到的问题更简单的术语向我解释。在处理
时
A Tour of C++ (Second Edition)
我已经尝试了几个示例。
我目前正在尝试在单独的函数中修改指向字符串文字的指针(我认为这很容易......)。
using namespace std;
void test(char *ptr)
{
ptr = "test";
}
int main()
{
char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}
使用g++编译时,得到
Warning: ISO C++ forbids converting a string constant to char*
显然 g++ 正在自动将 *p 转换为 const?我当然遗漏了一些基本的东西,但我之前的 SO 和 google 搜索并没有让我更接近答案。感谢您的回复!
编辑:
下面两个很好的例子。谢谢大家的回复,很有帮助!
Apparently g++ is auto-converting *p to a const?
恰恰相反。字符串 "abc"
将在您的二进制文件中,并且对于您的程序来说应该是只读的。因此,该字符串应该只被读取,并且在这种情况下分配字符串文字时得到的值是 const char*
类型的。您收到错误是因为您将其分配给非常量 char*
。试试这个:
const char *p = "abc";
此外,您还必须更改函数:
void test(const char *ptr)
{
ptr = "test";
}
它仍然会打印 abc
,但是。那是因为您只是在修改您传递的值的副本。但是 C++ 允许您改为传递引用,您可以这样做:
void test(const char *&ptr)
{
ptr = "test";
}
现在这是对指向 const char
的指针的引用...哇! "abc"
和 "test"
都将在编译时出现在程序的二进制文件中。当程序为运行时,"abc"
的地址赋值给char *p
,然后调用函数将其改为"test"
的地址。 &
告诉它使用实际的 char *p
而不是函数完成时丢失的副本。
有两件事可以const
;指针 (char * const
),或对象 (const char *
).
字符串文字是 const
,这就是编译器所抱怨的。你应该使用
const char *p = "abc";
尽管如此,函数仍然不会修改 main()
中的指针 p
,因为它是按值传递给函数的。
这应该修改指针:
using namespace std;
const char * str2 = "test";
void test(const char *& ptr)
{
ptr = str2;
}
int main()
{
const char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}
我有一个小问题,希望有人能用比我已经遇到的问题更简单的术语向我解释。在处理
时A Tour of C++ (Second Edition)
我已经尝试了几个示例。
我目前正在尝试在单独的函数中修改指向字符串文字的指针(我认为这很容易......)。
using namespace std;
void test(char *ptr)
{
ptr = "test";
}
int main()
{
char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}
使用g++编译时,得到
Warning: ISO C++ forbids converting a string constant to char*
显然 g++ 正在自动将 *p 转换为 const?我当然遗漏了一些基本的东西,但我之前的 SO 和 google 搜索并没有让我更接近答案。感谢您的回复!
编辑: 下面两个很好的例子。谢谢大家的回复,很有帮助!
Apparently g++ is auto-converting *p to a const?
恰恰相反。字符串 "abc"
将在您的二进制文件中,并且对于您的程序来说应该是只读的。因此,该字符串应该只被读取,并且在这种情况下分配字符串文字时得到的值是 const char*
类型的。您收到错误是因为您将其分配给非常量 char*
。试试这个:
const char *p = "abc";
此外,您还必须更改函数:
void test(const char *ptr)
{
ptr = "test";
}
它仍然会打印 abc
,但是。那是因为您只是在修改您传递的值的副本。但是 C++ 允许您改为传递引用,您可以这样做:
void test(const char *&ptr)
{
ptr = "test";
}
现在这是对指向 const char
的指针的引用...哇! "abc"
和 "test"
都将在编译时出现在程序的二进制文件中。当程序为运行时,"abc"
的地址赋值给char *p
,然后调用函数将其改为"test"
的地址。 &
告诉它使用实际的 char *p
而不是函数完成时丢失的副本。
有两件事可以const
;指针 (char * const
),或对象 (const char *
).
字符串文字是 const
,这就是编译器所抱怨的。你应该使用
const char *p = "abc";
尽管如此,函数仍然不会修改 main()
中的指针 p
,因为它是按值传递给函数的。
这应该修改指针:
using namespace std;
const char * str2 = "test";
void test(const char *& ptr)
{
ptr = str2;
}
int main()
{
const char *p = "abc";
test(p);
cout << p << "\n";
return 0;
}