今天看到一个函数,它的参数类型有char*的参数,然后我在传参的时候妄想写一个char*变量来存放字符串,然后把这个变量传入函数中,结果 就是出问题了。
#include <iostream>
#include <string>
using namespace std;
void test(char* c)
{
cout<<"正常"<<endl;
}
int main()
{
char*c="hello"; //错误的写法
test(c);
}
运行后编译器没有输出,还给了我一个警告

然后我给test函数和main主函数里的char*c做了一个小手脚:
#include <iostream>
#include <string>
using namespace std;
void test(const char* c)//const
{
cout<<"正常"<<endl;
}
int main()
{
const char*c="hello"; //const
test(c);
}
然后成功运行了:

那么const char*和char*有什么区别?
在第一个代码里我写的是char*c="hello";
首先,c是一个指针,而且是一个可以随意更改指向和地址存放的内容的指针。
"hello"是一个常量字符串,也就是这个地址里只能存放"hello",不能更改成其他的
这样一来就有问题了,现在我的c指向了"hello",
根据c指向的地址内容可以更改的规则和存放"hello"的地址内容不能更改的规则,这两个规则自相矛盾了
所以编译器会弹出警告。
那么const char* c是一个常量指针,指向一块地址,这块地址里存放的内容应该是常量,不可以被更改的。
这样一来const char*c和"hello"的规则不冲突,自然就能正常运行了
但是这样的话函数test()的参数类型也得加上const,如果还想用char*c
那就只能让主函数里的c变成数组
#include <iostream>
#include <string>
using namespace std;
void test(char* c)
{
cout<<"正常"<<endl;
}
int main()
{
char c[6]="hello";
test(c);
}
这样就行了。