关于const与指针搭配使用的一点记录
2011-05-08 21:17
579 查看
const限定符指定了一个变量为只读变量,是不允许被改变的,因此const变量在定义时就必须初始化。
const在与指针搭配时,使用将变的复杂和微妙。简单的说const搭配指针就会出现以下三种情况:
指向const变量(对象)的指针
const指针
指向const变量(对象)的const指针
1.指向const变量(对象)的指针
指针指向了const变量,例如 const int *ptr或者int const *ptr,这两种写法含义一样,这表示const限定了ptr所指向的数据类型,而并非ptr本身。即ptr本身并不是const.可以对ptr重新赋值,无需在定义时初始化。
指向const变量的指针可以指向一个const变量,也可以指向一个非const变量,当然指针类型与变量类型要一致。不管指向了一个const变量还是非const变量,任何企图通过这个指针去修改变量的值都会导致编译错误。同时,const变量只能赋给指向const变量的指针,赋给一个普通变量也是不允许的。
如(代码仅供理解const,不要刻意追求是否正确可执行):
const int *ptr;
int *ptr_1;
const int a=12;
const int b=13;
int c=14;
ptr=&a;/*指向const变量*/
ptr=&b;/*重新赋值指向const变量*/
*ptr=20;/*error,不能通过ptr修改*/
ptr=&c;/*重新赋值指向非const变量*/
ptr_1=&c;/*普通指针指向普通变量*/
ptr_1=&a;/*error,普通指针不能指向const变量*/
《C++ Primer》中对此有详细的解释,尽管不能通过指向const对象的指针去修改基础对象,然而如果该指针指向的是一个非const对象,可以用其他方法修改所指的对象。如下的例子:
const int *ptr;
int *ptr_1;
int c=14;
ptr=&c;
printf("c=%d\n",*ptr);
ptr_1=&c;
*ptr_1=18/*通过非指向const的指针修改*/
printf("c=%d\n",*ptr);
输出结果可以看到两次输出是不一样的。对此,《C++ Primer》中说,如果把指向const的指针理解为“自以为指向const的指针”,这可能会对理解有所帮助。
2.const指针
int a=12;
int *const ptr=&a
这意味着ptr这个指针被定义成const变量,必须在定义时初始化,并不能重新对ptr赋值,即不能将ptr再指向其他变量。但是,*ptr=13,这样的操作完全取决与a是不是一个const变量,在这个例子中不是,所以*ptr=13是正确的,假如a这样定义,const int a=12,*ptr=13会导致错误。
3.指向const变量(对象)的const指针
const int a=12;
const int *const ptr=&a;
这就意味着ptr不能被重新赋值,因为它是const指针,定义时需初始化;同时不能通过ptr修改a,因为a也是const变量。
4.有趣的typedef
typedef string *pstring;
const pstring cstr;
这时,cstr是一个指向string类型的const指针,而不是一个指向const string的普通指针。因为const pstring cstr;,const修饰的是pstring这个类型,而这个类型是一个string指针。其实:
string s;
typedef string *pstring;
/*以下三个定义相同,都是指向string的const指针*/
const pstring cstr1=&a;
pstring const cstr2=&a;
string *const cstr3=&a;
5.记忆方法
记忆方法其实很简单,只需看清const和*的位置就可以,const在前,则是指向const变量的指针,如:
const int *ptr;int const *ptr;
*在前,则是const指针,如:
int *const ptr;
两个const,则是指向const的const指针了,如:
const int *const ptr;
本文出自 “备忘” 博客,请务必保留此出处http://vindo.blog.51cto.com/2990328/561864
const在与指针搭配时,使用将变的复杂和微妙。简单的说const搭配指针就会出现以下三种情况:
指向const变量(对象)的指针
const指针
指向const变量(对象)的const指针
1.指向const变量(对象)的指针
指针指向了const变量,例如 const int *ptr或者int const *ptr,这两种写法含义一样,这表示const限定了ptr所指向的数据类型,而并非ptr本身。即ptr本身并不是const.可以对ptr重新赋值,无需在定义时初始化。
指向const变量的指针可以指向一个const变量,也可以指向一个非const变量,当然指针类型与变量类型要一致。不管指向了一个const变量还是非const变量,任何企图通过这个指针去修改变量的值都会导致编译错误。同时,const变量只能赋给指向const变量的指针,赋给一个普通变量也是不允许的。
如(代码仅供理解const,不要刻意追求是否正确可执行):
const int *ptr;
int *ptr_1;
const int a=12;
const int b=13;
int c=14;
ptr=&a;/*指向const变量*/
ptr=&b;/*重新赋值指向const变量*/
*ptr=20;/*error,不能通过ptr修改*/
ptr=&c;/*重新赋值指向非const变量*/
ptr_1=&c;/*普通指针指向普通变量*/
ptr_1=&a;/*error,普通指针不能指向const变量*/
《C++ Primer》中对此有详细的解释,尽管不能通过指向const对象的指针去修改基础对象,然而如果该指针指向的是一个非const对象,可以用其他方法修改所指的对象。如下的例子:
const int *ptr;
int *ptr_1;
int c=14;
ptr=&c;
printf("c=%d\n",*ptr);
ptr_1=&c;
*ptr_1=18/*通过非指向const的指针修改*/
printf("c=%d\n",*ptr);
输出结果可以看到两次输出是不一样的。对此,《C++ Primer》中说,如果把指向const的指针理解为“自以为指向const的指针”,这可能会对理解有所帮助。
2.const指针
int a=12;
int *const ptr=&a
这意味着ptr这个指针被定义成const变量,必须在定义时初始化,并不能重新对ptr赋值,即不能将ptr再指向其他变量。但是,*ptr=13,这样的操作完全取决与a是不是一个const变量,在这个例子中不是,所以*ptr=13是正确的,假如a这样定义,const int a=12,*ptr=13会导致错误。
3.指向const变量(对象)的const指针
const int a=12;
const int *const ptr=&a;
这就意味着ptr不能被重新赋值,因为它是const指针,定义时需初始化;同时不能通过ptr修改a,因为a也是const变量。
4.有趣的typedef
typedef string *pstring;
const pstring cstr;
这时,cstr是一个指向string类型的const指针,而不是一个指向const string的普通指针。因为const pstring cstr;,const修饰的是pstring这个类型,而这个类型是一个string指针。其实:
string s;
typedef string *pstring;
/*以下三个定义相同,都是指向string的const指针*/
const pstring cstr1=&a;
pstring const cstr2=&a;
string *const cstr3=&a;
5.记忆方法
记忆方法其实很简单,只需看清const和*的位置就可以,const在前,则是指向const变量的指针,如:
const int *ptr;int const *ptr;
*在前,则是const指针,如:
int *const ptr;
两个const,则是指向const的const指针了,如:
const int *const ptr;
本文出自 “备忘” 博客,请务必保留此出处http://vindo.blog.51cto.com/2990328/561864
相关文章推荐
- C语言的const关键字与指针搭配使用
- [错误记录]关于指针传递获得数据使用错误问题....
- 关于Android使用git版本管理工具的一点记录
- linux环境下调试嵌入式设备时出现Aborted、segmentation fault、卡死的问题以及关于指针使用的一点想法
- 关于OJ上STL库使用的一点经验记录
- C语言的const关键字与指针搭配使用
- 一个关于指针+记录数据类型的使用技巧
- 关于const与指针混合使用的助记法
- C语言的const关键字与指针搭配使用
- C语言的const关键字与指针搭配使用
- const与指针搭配使用总结
- 关于c++中const和指针结合的使用
- 关于const关键字与指针的相关使用要点
- 关于Linux kernel 3.14 使用hook抓包不能成功的一点记录
- 关于指针中使用const
- 关于FineUI使用问题的一点记录。
- 关于对数组及指针使用sizeof的一点心得
- 关于iOS使用FFmpeg直播rtsp流的一点记录
- 关于在Eclipse中使用正则表达式替换的一点记录(使用正则表达式的分组)
- 关于指针数组、数组指针、及函数指针和指向函数指针数组的指针的一点理解