您的位置:首页 > 其它

const char*与char*作为函数参数使用详解

2013-08-31 22:40 423 查看
在我先前的一篇博文中介绍了C或C++中const关键字的常用算法,大家可以参考:C++之const关键字讲解。今天,我来详细分析下const作为参数的用法。首先,我们来看下面一段代码:

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*),因此它们是不相容的,在编译的时候就会报错。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐