关于指针常量和常量指针两种读起来就非常的容易搞混淆,正因为如此它们在面试官那里受到格外的亲睐,对应它们的了解,显示一个程序员的基础知识是否牢固。这里做一个小总结,加深一下自己对两者的理解,也希望能帮助还没搞定两者区别的新手们; 首先搞清楚什么是常量,在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和指针》
阅读(2329) | 评论(0) | 转发(0) |