const char*与char*作为函数参数使用详解
2013-08-31 22:40
423 查看
在我先前的一篇博文中介绍了C或C++中const关键字的常用算法,大家可以参考:C++之const关键字讲解。今天,我来详细分析下const作为参数的用法。首先,我们来看下面一段代码:
从报错的原来来看,是因为实参无法转化为形参,也即char**无法转化为const char**。为什么不能转化呢,C++标准对此又是怎么规定的呢?ANSI C标准中有这样一句话:每个实参都应该具有自己的类型,这样它的值就可以赋值给与它所对应的形参类型的对象(该对象类型不能含有限定符)。所以,参数传递过程类似于赋值,除非const
char** 对象可以赋值给一个char**的变量,否则在编译的时候就会报错。接下来,我们来看看ANSI C对赋值的约束: 赋值必须满足下列条件之一:两个操作数都是指向有限定符或无限定符的相容类型的指针(无),左边指针指向的类型必须具有右边指针指向类型的全部限定符。这句话可能不好理解,我们来看下面的一个例子。
上面的赋值合法吗?我们来简单分析下:
1)左操作数是一个指向有const限定符的char指针
2)右操作数是一个指向没有限定符的char指针
3)char类型与char类型是相容的,做操作数所指向的类型具有右操作数所指向类型的限定符,再加上自身的限定符(const)。
如果反过来,cp=cpp;这样就会报错了?不信,读者可以自己试试。
在ANSI C中有如下规定:const float*类型并不是一个有限定符的类型----它的类型是“指向一个具有const限定符的float类型的指针。也就是说const限定符是修饰指针所指向的类型,而不是指针本身。类似地,const char** 类型也是一个没有限定符的类型----它的类型是“指向一个具有const限定符的char类型的指针的指针。
由于char**和const char**都是没有限定符的指针类型,但他们所指向的类型不一样(前者指向char*,后者指向const char*),因此它们是不相容的,在编译的时候就会报错。
void foo( const char** str) { } int main(int argc, char** argv) { foo( argv); return 0; }大家先猜猜看,如果在window下的编译该段代码,是正确执行呢还是会报错?正如大家所预料的意义,程序执行时会报错,报的是什么错呢,看下图。
从报错的原来来看,是因为实参无法转化为形参,也即char**无法转化为const char**。为什么不能转化呢,C++标准对此又是怎么规定的呢?ANSI C标准中有这样一句话:每个实参都应该具有自己的类型,这样它的值就可以赋值给与它所对应的形参类型的对象(该对象类型不能含有限定符)。所以,参数传递过程类似于赋值,除非const
char** 对象可以赋值给一个char**的变量,否则在编译的时候就会报错。接下来,我们来看看ANSI C对赋值的约束: 赋值必须满足下列条件之一:两个操作数都是指向有限定符或无限定符的相容类型的指针(无),左边指针指向的类型必须具有右边指针指向类型的全部限定符。这句话可能不好理解,我们来看下面的一个例子。
char* cp; const char* cpp; cpp = cp;
上面的赋值合法吗?我们来简单分析下:
1)左操作数是一个指向有const限定符的char指针
2)右操作数是一个指向没有限定符的char指针
3)char类型与char类型是相容的,做操作数所指向的类型具有右操作数所指向类型的限定符,再加上自身的限定符(const)。
如果反过来,cp=cpp;这样就会报错了?不信,读者可以自己试试。
在ANSI C中有如下规定:const float*类型并不是一个有限定符的类型----它的类型是“指向一个具有const限定符的float类型的指针。也就是说const限定符是修饰指针所指向的类型,而不是指针本身。类似地,const char** 类型也是一个没有限定符的类型----它的类型是“指向一个具有const限定符的char类型的指针的指针。
由于char**和const char**都是没有限定符的指针类型,但他们所指向的类型不一样(前者指向char*,后者指向const char*),因此它们是不相容的,在编译的时候就会报错。
相关文章推荐
- 关于函数参数的const char *和char*引发的bug
- shell 使用数组作为函数参数的方法(详解)
- (int agrc,const char* const* argv)为参数的函数
- 指针数组作为函数参数的使用问题
- 使用函数模版作为函数参数
- 指向函数的指针作为参数时的使用方法
- 编写一个函数 int count_chars(char const *str,char const *chars) 函数应该在第一个参数中进行查找, 并返回匹配第二个参数所包含的字符的数量。
- 使用元组or字典作为函数参数
- python里函数怎么样使用元组或字典作为参数调用
- CButtonST的使用之把CButtonST的对象作为函数参数
- Golang中interface{}作为函数参数和函数返回值的使用
- jQuery中使用this作为函数参数
- 什么是引用,如何使用引用?使用引用作为函数参数,相关例题
- linux多线程创建时使用类成员函数作为参数
- C++关于类成员函数在参数列表后加const的作用,以及使用条件
- 漫谈C指针:函数指针作为函数参数使用
- Swift -- 函数的使用(函数作为参数、返回值、嵌套函数)
- 【C语言】编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。要求:不能使用C函数库中的字符串操作函数。
- C语言 编写一个函数reverse_string(char * string) 实现:将参数字符串中的字符反向排列。 要求:不能使用C函数库中的字符串操作函数。
- 《IOS_作业C语言》高级指针(结构体指针、结构体数组指针、结构体数组指针,作为函数的参数使用、预编译指令)