C 语言中char* 和const char*的区别
有一个函数这样定义char*findArg(char*){.....}定义一个constchar*USERNAME="su";调用时char*name=findArg(U...
有一个函数这样定义 char* findArg(char *){.....}
定义一个const char *USERNAME = "su";
调用时
char *name = findArg(USERNAME);
会报错,说const char *和char*不能转换。
但是这样
char *name = (char *)findArg(USERNAME);
就OK了
是不是见鬼了!
findArg前面(char *)是你说的“C的隐式类型转换”
转换谁呀
baqktdgt 说对了,可能是编译器太好了(IBM的XLC),findArg真正返回的是const char *型,尽管定义的是char* 型!
fuck C! 展开
定义一个const char *USERNAME = "su";
调用时
char *name = findArg(USERNAME);
会报错,说const char *和char*不能转换。
但是这样
char *name = (char *)findArg(USERNAME);
就OK了
是不是见鬼了!
findArg前面(char *)是你说的“C的隐式类型转换”
转换谁呀
baqktdgt 说对了,可能是编译器太好了(IBM的XLC),findArg真正返回的是const char *型,尽管定义的是char* 型!
fuck C! 展开
5个回答
展开全部
C 语言中char* 和const char*的区别:
一、含义的区别
char* 表示一个指针变量,并且这个变量是可以被改变的。
const char*表示一个限定不会被改变的指针变量。
二、模式的区别
char*是常量指针,地址不可以改变,但是指针的值可变。
const char*是指向常量的常量指针,地址与值均不可变。
三、指针指向的内容的区别
char*指针指向的内容是可以改变的,是不固定的。赋值后在数据传递的过程中允许改变。
const char*指针指向的内容是固定的,不可改变的。对传入的参数,不会对指针指向的内容进行修改
四、意义的区别
char* str确保str这个指针不会改变,但是这个指针里面的内容可以改变。
const char* str确保*str的内容不会改变,也就是用str这个指针无法改变str这个指针指向的地址的内容,但是可以改变这个指针。
参考资料来源:百度百科——CONST (C中的CONST)
展开全部
const char *p = "123";
p[1] = '3'; // 会报错
p = "456"; // 不会报错
const char * 只是说指针指向的内容不可变,但指针本身可以再赋值
假设你的程序是
char * findArg(char *s) {
return s;
}
这个时候,你如果传const char *进去,那么好一些的编译器,会知道,你传回的函数返回值,也是const char *,也就是指针指向的内容不可写。
所以如果你传进去的是const char *,最好还是把 char *name写成const char *name,因为char *name可以对指针指向的内容进行修改。
用强制转换当然也可以,但是
const char *name2 = "123";
char *name = (char *)name2;
如果你对name指向的内容进行改变,如 name[2] = '4';
"123"是常量,对常量进行修改,你的程序就会发生不可预知的错误
char* findArg(char *){.....}
如果你这个函数,对传入的参数,不会对指针指向的内容进行修改,最好写成 char * findArg(const char *) {....}
或 const char * findArg(const char *) {....}
p[1] = '3'; // 会报错
p = "456"; // 不会报错
const char * 只是说指针指向的内容不可变,但指针本身可以再赋值
假设你的程序是
char * findArg(char *s) {
return s;
}
这个时候,你如果传const char *进去,那么好一些的编译器,会知道,你传回的函数返回值,也是const char *,也就是指针指向的内容不可写。
所以如果你传进去的是const char *,最好还是把 char *name写成const char *name,因为char *name可以对指针指向的内容进行修改。
用强制转换当然也可以,但是
const char *name2 = "123";
char *name = (char *)name2;
如果你对name指向的内容进行改变,如 name[2] = '4';
"123"是常量,对常量进行修改,你的程序就会发生不可预知的错误
char* findArg(char *){.....}
如果你这个函数,对传入的参数,不会对指针指向的内容进行修改,最好写成 char * findArg(const char *) {....}
或 const char * findArg(const char *) {....}
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
const char* 是常量,一旦赋值就不允许改变。
char* 是变量,赋值后允许改变。
这么说应该很清楚了吧?
“调用时
char *name = findArg(USERNAME);
会报错,说const char *和char*不能转换。
但是这样”
这种调用保存是正常的,因为有的函数要求你传入一个函数内部可修改的内存地址。
你要非要传个const char*,就需要用C的隐式类型转换。
“char *name = findArg(( char* )USERNAME);”
但这么做极其不推荐。
char* 是变量,赋值后允许改变。
这么说应该很清楚了吧?
“调用时
char *name = findArg(USERNAME);
会报错,说const char *和char*不能转换。
但是这样”
这种调用保存是正常的,因为有的函数要求你传入一个函数内部可修改的内存地址。
你要非要传个const char*,就需要用C的隐式类型转换。
“char *name = findArg(( char* )USERNAME);”
但这么做极其不推荐。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2010-04-07
展开全部
不是见鬼了。。。
1. const char * 和 char *
后者可以赋值给前者,前者不能赋值给后者。
这是C标准里规定的。
你想想const作用是什么?如果把一个const修饰的赋值给一个没有const修饰的,会有什么后果?
2. char *name = (char *)findArg(USERNAME);
应该还是不可以吧。这个只是把返回类型强制转换,又没把参数强制类型转换。。。我试过之后再告诉你
1. const char * 和 char *
后者可以赋值给前者,前者不能赋值给后者。
这是C标准里规定的。
你想想const作用是什么?如果把一个const修饰的赋值给一个没有const修饰的,会有什么后果?
2. char *name = (char *)findArg(USERNAME);
应该还是不可以吧。这个只是把返回类型强制转换,又没把参数强制类型转换。。。我试过之后再告诉你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C 语言中char* 和const char*的区别
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询