const修饰指针的三种效果,C语言const修饰指针详解
int a; int *p =
当用 const 进行修饰时,根据 const 位置的不同有三种效果。原则是:修饰谁,谁的内容就不可变,其他的都可变。这三种情况在面试的时候几乎是必考的,在实际编程中也是经常使用的,所以初学者一定要掌握。
1) const int*p= a;同样 const 和 int 可以互换位置,二者是等价的。我们以放在最前面时进行描述。
当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。
这种用法常见于定义函数的形参。前面学习 printf 和 scanf,以及后面将要学习的很多函数,它们的原型中很多参数都是用 const 修饰的,这样做的好处是安全!我们通过参数传递数据时,就把数据暴露了。而大多数情况下只是想使用传过来的数据,并不想改变它的值,但往往由于编程人员个人水平的原因会不小心改变它的值。这时我们在形参中用 const 把传过来的数据定义成只读的,这样就更安全了。这也是 const 最有用之处。
所以如果你不想改变某个参数传过来的值,那么定义函数时就最好用 const 修饰这个参数,否则就不要用 const 修饰了。
2) int*const p= a;此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。
3) const int*const p= a;此时 *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
综上所述,使用 const 可以保护用指针访问内存时由指针导致的被访问内存空间中数据的误更改。因为指针是直接访问内存的,没有拷贝,而有些时候使用指针访问内存时并不是要改变里面的值,而只是要使用里面的值,所以一旦不小心误操作把里面的数据改了就糟糕了。
但是这里需要注意的是,上面第 1 种情况中,虽然在 *p 前加上 const 可以禁止指针变量 p 修改变量 a 中的值,但是它只能 禁止指针变量 p 修改 。也就是说,它只能保证在使用指针变量 p 时,p 不能修改 a 中的值。但是我并没有说 const 可以保护 a 禁止一切的修改,其他指向 a 的没有用 const 修饰的指针变量照样可以修改 a 的值,而且变量 a 自己也可以修改自己的值。下面写一个程序看一下:
# include stdio.h int main(void) int a = 10; const int *p = int * q = *q = 20; printf( a = %d/n , a); a = 30; printf( a = %d/n , a); //*p = 30; //这么写就是错的 return 0; }
输出结果是:
a = 20
a = 30
可见,只有用 const 修饰过的指针变量 p 不能修改 a 中的内容,而没有用 const 修饰过的指针变量 q 照样可以修改 a 中的内容,而且 a 自己也可以重新给自己赋值。
21519.html
相关文章
- C语言switch语句的用法详解_c语言switch语句例题
- 银行家算法 C语言实现 带注释
- C语言内存讲解-详说内存分布和heap空间
- 2018四川省大学程序设计竞赛(ACM) E: Ever17 ----------------------C语言——菜鸟级
- C语言关键字详解(五)带你全面了解 volatile 关键字
- C语言小项目 -- 五子棋小游戏(通用版)
- [C语言] 数据结构-算法效率的度量方法-事前分析估算方法详解编程语言
- [C语言] 数据结构-衡量算法的标准详解编程语言
- [编程] C语言循环结构计算π的值详解编程语言
- C语言之冒泡排序详解编程语言
- C语言之带有返回值的函数详解编程语言
- C语言之break和continue详解编程语言
- 数组名作为函数参数传递,C语言数组作为函数参数传递详解
- fgets函数及其用法,C语言fgets函数详解
- 条件编译,C语言条件编译详解
- typedef的用法,C语言typedef详解
- extern关键字,C语言extern关键字用法详解
- C语言希尔排序算法
- Linux:基于C语言的操作系统(linux基于什么语言)
- Linux 下C语言实现暂停机制(linuxc语言暂停)
- 探索C语言、Linux开发环境新体验(clinux开发环境)
- Linux下C语言开发之旅:体验跨平台开发乐趣(linux下写c语言)
- 从C语言中操作MySQL结果集分析(c mysql 结果集)
- 库解决Oracle数据库之C语言读取方案(c 读出oracle数据)
- 数据库如何使用C语言读取Oracle数据库(c 怎么读取oracle)
- C语言与Oracle数据库的新增应用(c oracle 新增)
- C语言中#define与typedef的互换细节详解
- C语言高斯消元法的使用详解
- C语言实现排序算法之归并排序详解
- C语言实现单链表逆序与逆序输出实例