下边是网上收集到的
const char*, char const*, char*const的区别问题几乎是C++面试中每次都会有的题目。
事实上这个概念谁都有只是三种声明方式非常相似很容易记混。
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:
把一个声明从右向左读。
char * const cp; ( * 读成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。
下面定义的一个指向字符串的常量指针:
char * const prt1 = stringprt1;
其中,ptr1是一个常量指针。因此,下面赋值是非法的。
ptr1 = stringprt2;
而下面的赋值是合法的:
*ptr1 = "m";
因为指针ptr1所指向的变量是可以更新的,不可更新的是常量指针ptr1所指的方向(别的字符串)。
下面定义了一个指向字符串常量的指针:
const * ptr2 = stringprt1;
其中,ptr2是一个指向字符串常量的指针。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,
*ptr2 = "x";
是非法的,而:
ptr2 = stringptr2;
是合法的。
所以,在使用const修饰指针时,应该注意const的位置。定义一个指向字符串的指针常量和定义一个指向字符串常量的指针时,const修饰符的位置不同,前者const放在*和指针名之间,后者const放在类型说明符前。
看了之后终于恍然大悟:
其实就2种说法:
- 一个是指针不变,“内容”可变 如:char * const cp;
- 一个是指针可变,“内容”不变(指针所指的具体的值),如const char * p,char const * p;。
以下贴出本人在VS 2008里做的测试代码
不对指出大家可以指出,谢谢
#include <iostream>
#include "stdio.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
/**************第一种情况开始***********/
// 指针所指向的内容是只读的。
int tt=3;
//赋了初值, tt也可以是const int tt
const int *a=&tt;
// *a=5; //a所指向的值不可以改变了,所以这行会编译出错
cout<<*a<<endl;
int t1=9;
a=&t1; //改变地址或指针是可以的。
/**************第一种情况结束***********/
/**************第二种情况开始***********/
// 这个和上面的一样
int const * bb = &tt;
cout<<*bb<<endl;
int ddx=8;
bb=&ddx; //注意,这改变的是指针,所以可以通过编译
cout<<*bb<<endl;
/**************第二种情况结束***********/
/**************第三种情况开始***********/
/*
指针是只读的
*/
int * const cc = &tt; // const指针b 赋初值 ,但如果 tt是 const int tt 则会报错;
cout<<*cc<<endl; //输出tt 3
*cc=6; //更改cc所指向的内容,合法
cout<<*cc<<endl; //输出tt 3
//cc=&ddx; //这试图改变cc所指向的地址,是不合法的,
// 以下试图构造指针p_dd并赋值给cc,会出错 */
//int dd=8;
//int* p_dd=ⅆ
//cc=p_dd;
/**************第三种情况结束***********/
/***************第四种情况开始***********/
//指针和指针说指向的内容都是只读的。。。
const int ttt=1;
const int * const ee=&ttt; //赋的值也必须是只读的。
//以下都会出错
//ee=&tt; //改变地址,不合法
//*ee=tt; //改变指针的内容,也不合法
/*************第四种情况结束************/
getchar();
return 0;
}