您的位置:首页 > 其它

细谈const char ** 与 char ** 的区别 .

2012-11-03 22:20 295 查看
细谈const char ** 与 char ** 的区别

摘自:/article/8458396.html

[c-sharp]
view plaincopyprint?

#include "stdafx.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
const char ** p0=NULL;
char ** p1=NULL;
p0=p1;
}
// error C2440: “=”: 无法从“char **”转换为“const char **”

[c-sharp]
view plaincopyprint?

#include "stdafx.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
const char * p0=NULL;
char * p1=NULL;
p0=p1;
}

#include "stdafx.h"
#include <iostream>
using namespace std;

int main(int argc, char* argv[])
{
const char * p0=NULL;
char * p1=NULL;
p0=p1;
}


毫无疑问,这个典型的程序成功的运行了。p0是指向有const限定符的char类型的指针,也就是p0指向const char类型,而p1指向char类型的指针,即p1指向char。所以,比较p0和p1就是比较const char 和 char。众所周知,const char是绝对不能用char来赋值的,即const char c1= char c2。但是指向const char类型的指针p0却可以用指向char类型的指针p1赋值,即p0=p1。这个类型转换还有一个明显的特征就是const char类型是char类型的const形式。这里我们由程序总结出这样一个规律:

const type * p1;

type * p2;

p1=p2;

注意:两个'type'表示相同的类型(int ,char,char*...... )。

让我们再回到最初的那个问题——const char ** p0和 char ** p1的区别。首先,根据《C陷阱与缺陷》中的“大嘴原则”(编译器会从左至右尽可能的将最长的字符串组合成一个有意义的标识),p0是指向“const char *” 的指针,p1是指向“char *”的指针。你可能会这样想,const char * 不正是 char * 的const形式吗?但是人的第一直觉往往是错的,不要相信自己的眼睛,用心去分析。const char * 是一个指针类型,它指向const char类型,而char
* 也是一个指针,它指向char类型。哈哈,我想你已经恍然大悟了,const char * 和 char *根本就是两个不同类型的指针,换句话说,const char * 根本就不是 char * 的const形式。你现在一定在想“char * 的const形式是什么?它与const char * 有什么不同?”,如果你没有这样想,我先在这里道歉,请原谅我的自大,呵呵。char * p的const形式就是char * const p。如果你已经明白了,那么请忽视我接下来的罗里罗嗦。const char *
p表示p指向const char 类型,也就是说p这个指针本身并不是const的,p是可以作为左值的(可以被多次赋值),只是p指向的变量是const的(p不可以通过解引用*p去修改p指向的变量)。明白了原理之后,我们编写一个测试程序试一下。

[c-sharp]
view plaincopyprint?

#include "stdafx.h"

#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
// const char ** 的赋值过程

const char c1='x';
const char * p0=&c1;
const char ** p1=&p0;
// char ** 的赋值过程

char c2='y';
char * p2=&c2;
char ** p3=&p2;
char * const * p4=p3;// 注意:char * const * 就是char ** 的赋值兼容类型

}

[c-sharp]
view plaincopyprint?

#include "stdafx.h"

#include <iostream>

using namespace std;

void const_test(const char ** p)
{
cout<<"I am in finction const_test."<<endl;
}

int main(int argc, char* argv[])
{
char c='x';
char * p1=&c;
char ** p2=&p1;
const_test(p2);
}
// error C2664: “const_test”: 不能将参数1 从“char **”转换为“const char **”

#include "stdafx.h"
#include <iostream>
using namespace std;

void const_test(const char ** p)
{
cout<<"I am in finction const_test."<<endl;
}

int main(int argc, char* argv[])
{
char c='x';
char * p1=&c;
char ** p2=&p1;
const_test(p2);
}
// error C2664: “const_test”: 不能将参数1 从“char **”转换为“const char **”


正确的函数参数类型写法是这样的。

[c-sharp]
view plaincopyprint?

#include "stdafx.h"

#include <iostream>

using namespace std;

void const_test(char * const * p)
{
cout<<"I am in finction const_test."<<endl;
}

int main(int argc, char* argv[])
{
char c='y';
char * p1=&c;
char ** p2=&p1;
const_test(p2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: