Chinaunix首页 | 论坛 | 博客
  • 博客访问: 374008
  • 博文数量: 48
  • 博客积分: 1032
  • 博客等级: 上士
  • 技术积分: 1256
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-19 13:24
文章分类

全部博文(48)

文章存档

2014年(3)

2013年(23)

2012年(22)

分类: C/C++

2012-11-09 14:41:10

    关于指针常量和常量指针两种读起来就非常的容易搞混淆,正因为如此它们在面试官那里受到格外的亲睐,对应它们的了解,显示一个程序员的基础知识是否牢固。这里做一个小总结,加深一下自己对两者的理解,也希望能帮助还没搞定两者区别的新手们;
   首先搞清楚什么是常量,在c语言中怎么定义常量?在ANSI C中,常量的样子和变量完全一样,只是它们的值不能被修改。通常使用const关键字来声明常量;声明可以有两种形式;
int const a;
const int a;
两条语句都是声明a为一常量,并且都是合法的,根据个人爱好选择一种形式并坚持使用同一形式即可。(我选择后一种形式)。
常量有两种赋值方法:
1、在声明的时候进行初始化: const int a = 15;
2、在函数中声明为const的形参在函数被调用时会得到实参的值:size_t strlen(const char *string);
    当常量被用于指针的时候,情况变得复杂有趣,因为指针涉及到两种情况:指针所指向的对象和指针本身;如果是指针所指向的对象是常量也就是我们所说的常量指针指针本身是常量就是所谓的指针常量

两者在定义时的区别就是‘const’‘*’的位置:常量指针:const在*之前,指针常量:cosnt在*之后
例如:常量指针:const char* string;
      指针常量:char*  const string;
说明:我这里把*和数据类型挨着写(char* string)只是为了方便说明,习惯上我们使用指针是将*和表示指针的字符串挨着写的(char *string);

    先定义一个指针变量说明一下指针的构成:char *string;指针变量和其他变量一样是由变量类型和变量名构成。但是由于指针的特殊性指针变量的变量类型是(char *)[变量类型一定程度上也可以理解为指针所指的对象,明白这点对应理解指针常量和常量指针十分的重要]变量名是(string)[理解为指针本身];将这两部分分开之后就很容易记住指针常量和常量指针的差别了。
重点:
1、常量指针:const char* string;//const实际上修饰的是变量类型char*,也就是变量所指向的对象;说明string指针所指向的对象必须是一个常量。这样一来其功能就是该指针所指向地址空间的内容是不能改变的,但是指针的指向还是可以改变的
2、指针常量:char*  const string;//const修饰的指针变量的名字string,也就是说让变量本身成为一个常量;这样在使用指针string的时候它的指向是不能改变的,但是它所指向的对象的值是可以改变的

    在平常使用过程中使用的较多的还是常量指针,通过在函数中声明为const的形参在函数被调用时会得到实参的值;比如很多c库函数就是这种用法,比如:计算字符串长度的c库函数 :
size_t strlen(const char *string);
在调用该函数的时候传入的实参值是不能被改变的。

    看了上面的说明,应该知道数组名的实质了吧,数组名就是一个指针常量,其指向数组的第一个元素,它的指向不能改变,但是数组的第一个元素的内容是可以改变的。

参考书:《c和指针》
  
阅读(1949) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~