原帖时间:2008年7月30日 http://blog.csdn.net/winglet/archive/2008/07/30/2740781.aspx
-----------------------------------------------------------------------------------------------------------------------------------
指针和const限定符之间存在着两种交互类型:指向const对象的指针和const指针。两种类型的含义相信都不难理解(下文马上介绍),但是在具体的应用环境下,相信还是会有很多初学者犯迷糊。尤其是面临找工作的初学者,如果不能弄清const和指针之间的一些细致的区别和联系,可能会给你的笔试或面试带来麻烦。
本文的所有基础知识均来源于《C++ Primer》中文版第四版,P110页,去读读吧:)
当const用于限定一个基础对象时,意义再清楚不过了,例如:
const double c_pi = 3.14; //double const c_pi = 3.14;
上面两句代码代表的意思是一样的,事实上,const在限定类型的时候,放在类型前和放在类型后都是没有问题的(后面的一个试验将进一步证明这一点)。
但是,当把指针加进来时,情况变得稍微复杂了一些。
1. 指向const对象的指针
const double *cptr;
以上cptr就是一个指向double类型const对象的指针。但是cptr本身并不是const的,则你可以使用改变cptr指针本身的值(做指针运算或将其指向另一个对象),但是不能用cptr去改变它所指向对象的值。再来看以下代码:
const double c_pi = 3.14; double pi = 3.14; double* ptr; const double* cptr;//节省篇幅,写为一行
则以下的做法:
a. ptr = &c_pi; //error!
b. ptr = π
c. cptr = &c_pi;
d. cptr = π
以上的代码,a是不对的(编译出错),其他都是可行的。注意d,也就是说,允许将非const对象赋给指向const对象的指针。这样的话,就不能通过cptr来修改pi的值,但是,pi的值可以通过其他的渠道修改,也就是说,cptr所指向的对象只是说不可以通过cptr解引用以后修改,但是仍有可能通过其他的方式来修改(如果基础对象本身是非const的话)。
在实际的应用中,指向const对象的指针,常用于做函数的形参,确保传递给函数的实际对象不会因为形参而被修改。指向const对象指针的另一个用途是用来指向const对象(必须用 "指向const对象的指针" 来指向const对象)。
2. const指针
int num = 9;
int* const c_ptr = #
以上的代码定义了一个const指针,可以从右向左练作 "c_ptr是const指针,它指向int型对象"。const指针的意思与其他const对象一样,即指针本身的值不可修改,不能进行指针运算,不能让其再指向另外一个对象,甚至不能赋回同样的值(如:c_ptr = c_ptr; //error!)。但是指针本身指向的基础对象可以使用指针解引用后修改其值。
你或许已经全部理解了,好,我们再来看看以下的代码(不要犯迷糊哦,因为下面代码的目标就是要让你犯迷糊,但是,我的终极目标是让你不再迷糊,ohyeah! ):
const int c_num = 5;
int num = 6;
a. int const *ptr_0;
b. int const *ptr = &c_num;
c. int const *ptr_1 = #
d. int * const ptr_2;//-----------------------error!
e. int * const ptr_3 = &c_num;//----------error!
f. int * const ptr_4 = #
g. ptr = ptr;
h. *ptr = 7;//----------------------------------error!
i. *ptr_1 = 7;//--------------------------------error!
j. ptr_4 = ptr_4;//----------------------------error!
k. *ptr_4 = 7;
上面的代码,其实主要在考察(int const*)和(int* const)到底是两个什么东西,int* const不用说,是const指针;int const*其实和const int *一样。一个很简单的记忆方法是从右往左来阅读定义。上面代码错误的原因依次为:
d错误的原因是const指针必须初始化;
e错误的原因是试图用const指针指向const对象,const对象必须用"指向const对象的指针"来指向,而不是const指针,这是要特别注意的!
h和i用于演示使用"指向const对象的指针"是无法改变基础对象值的,无论其所指向的对象是否是const;
j的错误在于试图改变const指针本身的值。
通过上面的说明,我想我们都应该能够区分以下的声明了:
int * const ptr;//-------error!
int const *ptr;
const int *ptr;
3. 指向const对象的const指针
如果把两者结合起来,就是指向const对象的const指针,意义也是将两者结合起来:既不能修改指针值,也不能通过该指针修改其所指向的对象。
const int c_num = 4;
int num = 5;
const int* const ptr = &c_num;
cosnt int* const ptr_1 = #
上面的代码都是对的,原因相信不用多解释了吧,呵呵。
4. 再加上typedef
如果把typedef加进来,问题又变得迷糊了。
typedef string *pstring;
cosnt pstring cstr;
cstr到底是(const string*)呢,还是(string *const)?答案是后者,如果此时你把typedef当作文本扩展,就极有可能弄错cstr的真正含义。再看如下代码:
string str;
typedef string* pstring;
a. const pstring cstr_1 = &str;
b. pstring const cstr_2 = &str;
c. string* const cstr_3 = &str;
上面a、b、c所声明的都是const指针,注意a和b也再次说明了const与类型的前后关系是不确定的,C++ Primer建议将const放在类型前面。
5. 总结
没什么说的,希望我们都不再迷糊,o(∩_∩)o...哈哈!ps:C++ Primer很好很强大!
另外参考:
http://www.99inf.net/SoftwareDev/VC/53240.htm
---------------------------------
华赛一面的一道题:
typedef char * pstr;
const char *p1 = "abc";
const pstr p2 = "abc";
p1++;
p2++;
问:有没有错,错在哪里?
答:p2++错, p2是常量指针。
分享到:
相关推荐
const限定符可以用于修饰不同的数据类型,包括基本数据类型和指针类型,从而赋予变量不同的保护级别。本文将详细介绍const限定符在C语言中的应用,包括其引入缘由、用法以及如何通过正确使用const限定符来提高程序的...
总的来说,`const`限定符与指针的组合使用是C++中控制程序行为和数据安全性的重要手段。正确使用它们可以避免意外的修改,提高代码的可靠性和可维护性。通过深入理解和熟练应用这些概念,开发者能够编写出更加优雅和...
### C++中的const限定修饰符 #### 一、引言 在C++编程语言中,`const`关键字是一个非常重要的特性,它可以帮助开发者确保某些数据或对象在其生命周期内的不变性,从而提高代码的安全性和可维护性。本文将详细介绍`...
本篇文章将深入探讨`const`限定符的各个方面,包括初始化、指针、引用以及一些特殊规则。 1. `const`变量的初始化: `const`变量在声明时必须进行初始化,因为它们一旦创建,其值就不能更改。例如,以下代码是正确...
6. NULL指针、悬空指针、VOID指针和CONST限定符。 7. 动态数据结构的工作原理。 8. 指向指针的指针。 9. 三重和四重指针。 10. 自引用结构体、结构体填充和基于缓存的优化技术。 书中不仅讲解了指针的基本概念,...
第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值...
同时,const限定符在使用时需要明确其修饰的是指针变量还是指针所指向的数据,这样可以更安全、有效地使用指针。 以上内容概述了const修饰符在修饰变量和指针时的不同效果,以及其在程序设计中的重要作用和使用场景...
4.2.5 指针和const限定符 4.3 C风格字符串 4.3.1 创建动态数组 4.3.2 新旧代码的兼容 4.4 多维数组 第5章 表达式 5.1 算术操作符 5.2 关系操作符和逻辑操作符 5.3 位操作符 5.3.1 bitset对象或整型值的...
6. const限定函数的值型返回值:函数返回值前使用const限定表明函数返回的是一个常量对象,这意味着返回的对象不能被赋值或修改。 7. const限定类的成员函数:类成员函数声明中的const表示该函数不会修改调用它的...
8. **指针和const限定符**:指针变量存储的是内存地址,`int *p = &x;`定义了一个指向`int`类型变量`x`的指针。`const`限定符可以用来修饰指针,使得指针不可变或指针所指的对象不可变。 9. **动态内存分配**:C++...
指针的定义与运算 指针与数组的关系 字符串函数 指针与const限定符 传递指针参数 动态内存分配方法 函数指针
本文将深入探讨`const`限定符的使用、意义以及它在不同情况下的应用。 首先,`const`用于声明常量,一旦创建,其值就不能更改。例如,`const int bufsize = 512;`定义了一个名为`bufsize`的常量,尝试给它赋新值会...
在C++编程语言中,`const`限定符是一个至关重要的概念,它用于声明不可变的对象。`const`关键字可以应用于变量、指针和引用,帮助程序员确保某些数据不会被意外修改,从而增强程序的稳定性和安全性。以下是关于`...
在C语言中,const修饰符是一个非常重要的概念,它可以用来限定变量的值,防止其被修改,从而提高程序的健壮性和安全性。本文将对C语言中的const修饰符进行浅析,讨论它在不同场合、不同位置的使用,以及它对程序的...
【指针】是C/C++等编程语言中的一个重要概念,它是一个变量,其值为另一个变量的内存地址。通过指针,程序可以间接访问和修改数据。...在实际编程中,结合const限定符能提高代码的可读性和安全性。
在C++编程语言中,`const`类型限定符是一个非常重要的特性,用于声明变量、函数参数或成员函数不可变。然而,在实际编程过程中,我们可能会遇到`const`类型的不兼容问题,这通常涉及到对`const`修饰的成员函数的调用...
9. 指针与const限定符:讲解const限定符在指针上的使用,包括常量指针和指向常量的指针的定义和区别。 10. 指针的高级用法:包括指针函数、函数指针以及回调函数的概念和使用。 为了帮助学生更好地掌握指针的知识...
const限定符可以用于限定变量的值不可以被修改,也可以用于限定函数的返回值不可以被修改。 七、总结 C++语言是一个功能强大且灵活的编程语言,本文档详细整理了C++语言的基础知识,为初学者和培训机构提供了有...
- **指针和对象的区别**: `const`可以用于修饰指针本身(不可变的指针),也可以用于修饰指针所指向的对象(指向不可变对象的指针)。 #### 六、总结 `const`关键字在C++中是一个非常强大的工具,它可以帮助程序员...