您的位置:首页 > 其它

指针知识梳理6-const与指针

2014-06-21 19:13 295 查看
const 定义的变量为只读变量,在语法层面上通过这个变量去修改内存是不允许的。

但是对于以下代码,就有很多人绕了:

const int *p1; //p1能变,*p1不能变

int const *p2; //p2能变,*p2不能变

int *const p3; //p3不能变,*p2能变

我们通过代码来验证说明这三种写法:

</pre><p></p><pre>

#include <stdio.h>
int main()
{
int a;
int b;
const int *p1 = &a;//初始化
int const *p2 = &a;//初始化
int *const p3 = &a;//初始化

a = 1; //说明a相关的内存可读写

// p1 p2 是一样效果。
p1 = &b; //编译通过,说明p1本身可以写。
*p1 = 1; //编译不通过,说明语法上不允许 通过p1 去写a 的内存。

p2 = &b; //编译通过,说明p2本身可以写。
*p2 = 1; //编译不通过, 说明语法上不允许 通过p2 去写a 的内存。
//注意以上a 本身的内存是可读写的,只不过通过p1 p2没有权限去修改。

p3 = &b; //编译不通过,说明p3本身不可以写。
*p3 = 1; //编译通过,说明语法上 可以通过p3去修改a的内存。

return 0;
}


对于上面记忆有个小技巧,当 const 在*的左边的时候,修饰的是 *p ,则 *p 是不能改变的,也就是说所谓不能改变p指向的内存。

当const 在*右边的时候,修饰的是 p ,p不能改变。

const 与指针结合 用来提高程序员写代码的严谨性:

比如以下代码

void strcpy(char *src ,const char *dest);

这个strcpy函数期望做的是 把dest指向的内存处的字符串拷贝到 src指向的内存处。

那么其实 这种函数接口也能够完全实现,但是,如果在实现strcpy的时候,在函数中不小心修改了 dest指向的内存,那么就改函数接口的本意有悖,因为 按照正常逻辑,你拷贝东西的时候不会改变原来的东西。

比如不小心写了以下代码

void  strcpy(char *dest ,char *src)
{
*src = 'a';
//其他代码
}
这样语法上没问题,但是运行就有问题了。

如果接口设计成 const char *src

void  strcpy(char *dest ,const char *src)
{
*src = 'a'; //当写出这样的代码的时候编译就会报错,提高了代码的安全性。
//其他代码
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: