`
anna_zr
  • 浏览: 200501 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

指针和const限定符

阅读更多
原帖时间: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是常量指针。


分享到:
评论

相关推荐

    关于C语言中类型限定符const的研究.pdf

    const限定符可以用于修饰不同的数据类型,包括基本数据类型和指针类型,从而赋予变量不同的保护级别。本文将详细介绍const限定符在C语言中的应用,包括其引入缘由、用法以及如何通过正确使用const限定符来提高程序的...

    指针与const限定符的使用分析

    总的来说,`const`限定符与指针的组合使用是C++中控制程序行为和数据安全性的重要手段。正确使用它们可以避免意外的修改,提高代码的可靠性和可维护性。通过深入理解和熟练应用这些概念,开发者能够编写出更加优雅和...

    C++中的const限定修饰符

    ### C++中的const限定修饰符 #### 一、引言 在C++编程语言中,`const`关键字是一个非常重要的特性,它可以帮助开发者确保某些数据或对象在其生命周期内的不变性,从而提高代码的安全性和可维护性。本文将详细介绍`...

    详解C/C++中const限定符总结

    本篇文章将深入探讨`const`限定符的各个方面,包括初始化、指针、引用以及一些特殊规则。 1. `const`变量的初始化: `const`变量在声明时必须进行初始化,因为它们一旦创建,其值就不能更改。例如,以下代码是正确...

    Pointers in C

    6. NULL指针、悬空指针、VOID指针和CONST限定符。 7. 动态数据结构的工作原理。 8. 指向指针的指针。 9. 三重和四重指针。 10. 自引用结构体、结构体填充和基于缓存的优化技术。 书中不仅讲解了指针的基本概念,...

    C++Primer视频(初级)下载地址

    第4章指针和const限定符 33.第4章C风格字符串 34.第4章创建动态数组 35.第4章新旧代码的兼容 36.第4章多维数 37.第5章算术操作符 38.第5章关系操作符和逻辑操作符 39.第5章位操作符 40.第5章赋值...

    非常经典的c++ primer视频教程6-10

    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对象或整型值的...

    C++:浅谈修饰符const

    6. const限定函数的值型返回值:函数返回值前使用const限定表明函数返回的是一个常量对象,这意味着返回的对象不能被赋值或修改。 7. const限定类的成员函数:类成员函数声明中的const表示该函数不会修改调用它的...

    c++基础教案.ppt

    8. **指针和const限定符**:指针变量存储的是内存地址,`int *p = &x;`定义了一个指向`int`类型变量`x`的指针。`const`限定符可以用来修饰指针,使得指针不可变或指针所指的对象不可变。 9. **动态内存分配**:C++...

    C++ 指针 及其实例

    指针的定义与运算 指针与数组的关系 字符串函数 指针与const限定符 传递指针参数 动态内存分配方法 函数指针

    C++Primer const限定符

    本文将深入探讨`const`限定符的使用、意义以及它在不同情况下的应用。 首先,`const`用于声明常量,一旦创建,其值就不能更改。例如,`const int bufsize = 512;`定义了一个名为`bufsize`的常量,尝试给它赋新值会...

    c++ primer中的const限定符

    在C++编程语言中,`const`限定符是一个至关重要的概念,它用于声明不可变的对象。`const`关键字可以应用于变量、指针和引用,帮助程序员确保某些数据不会被意外修改,从而增强程序的稳定性和安全性。以下是关于`...

    C语言中const用法浅析.pdf

    在C语言中,const修饰符是一个非常重要的概念,它可以用来限定变量的值,防止其被修改,从而提高程序的健壮性和安全性。本文将对C语言中的const修饰符进行浅析,讨论它在不同场合、不同位置的使用,以及它对程序的...

    指针

    【指针】是C/C++等编程语言中的一个重要概念,它是一个变量,其值为另一个变量的内存地址。通过指针,程序可以间接访问和修改数据。...在实际编程中,结合const限定符能提高代码的可读性和安全性。

    C++ 中const 类型限定符不兼容问题

    在C++编程语言中,`const`类型限定符是一个非常重要的特性,用于声明变量、函数参数或成员函数不可变。然而,在实际编程过程中,我们可能会遇到`const`类型的不兼容问题,这通常涉及到对`const`修饰的成员函数的调用...

    C语言教学中“指针教学方法”探讨.pdf

    9. 指针与const限定符:讲解const限定符在指针上的使用,包括常量指针和指向常量的指针的定义和区别。 10. 指针的高级用法:包括指针函数、函数指针以及回调函数的概念和使用。 为了帮助学生更好地掌握指针的知识...

    C++笔记整理

    const限定符可以用于限定变量的值不可以被修改,也可以用于限定函数的返回值不可以被修改。 七、总结 C++语言是一个功能强大且灵活的编程语言,本文档详细整理了C++语言的基础知识,为初学者和培训机构提供了有...

    C++中const关键字详解

    - **指针和对象的区别**: `const`可以用于修饰指针本身(不可变的指针),也可以用于修饰指针所指向的对象(指向不可变对象的指针)。 #### 六、总结 `const`关键字在C++中是一个非常强大的工具,它可以帮助程序员...

    c语言const的用法程序设计语言.pdf

    最后,文档中的代码示例还演示了const限定符的使用错误情况,如尝试修改const修饰的变量或指针,以及const修饰的数组。这些错误会导致编译失败,错误信息提示修改了只读变量,帮助程序员快速定位问题。 通过这些...

Global site tag (gtag.js) - Google Analytics