const
来源:互联网 发布:淘宝店铺文案范文 编辑:程序博客网 时间:2024/06/05 14:38
4. 指针与const
限定符
const
限定符和指针结合起来常见的情况有以下几种。
const int *a;int const *a;
这两种写法是一样的,a
是一个指向const int
型的指针,a
所指向的内存单元不可改写,所以(*a)++
是不允许的,但a
可以改写,所以a++
是允许的。
int * const a;
a
是一个指向int
型的const
指针,*a
是可以改写的,但a
不允许改写。
int const * const a;
a
是一个指向const int
型的const
指针,因此*a
和a
都不允许改写。
指向非const
变量的指针或者非const
变量的地址可以传给指向const
变量的指针,编译器可以做隐式类型转换,例如:
char c = 'a';const char *pc = &c;
但是,指向const
变量的指针或者const
变量的地址不可以传给指向非const
变量的指针,以免透过后者意外改写了前者所指向的内存单元,例如对下面的代码编译器会报警告:
const char c = 'a';char *pc = &c;
即使不用const
限定符也能写出功能正确的程序,但良好的编程习惯应该尽可能多地使用const
,因为:
const
给读代码的人传达非常有用的信息。比如一个函数的参数是const char *
,你在调用这个函数时就可以放心地传给它char *
或const char *
指针,而不必担心指针所指的内存单元被改写。尽可能多地使用
const
限定符,把不该变的都声明成只读,这样可以依靠编译器检查程序中的Bug,防止意外改写数据。const
对编译器优化是一个有用的提示,编译器也许会把const
变量优化成常量。字符串字面值通常分配在
.rodata
段字符串字面值类似于数组名,做右值使用时自动转换成指向首元素的指针,这种指针应该是
const char *
型。我们知道printf
函数原型的第一个参数是const char *
型,可以把char *
或const char *
指针传给它,所以下面这些调用都是合法的:const char *p = "abcd";const char str1[5] = "abcd";char str2[5] = "abcd";printf(p);printf(str1);printf(str2);printf("abcd");
注意上面第一行,如果要定义一个指针指向字符串字面值,这个指针应该是
const char *
型,如果写成char *p = "abcd";
就不好了,有隐患,例如:int main(void){char *p = "abcd";...*p = 'A';...}
p
指向.rodata
段,不允许改写,但编译器不会报错,在运行时会出现段错误。
- const
- const
- const
- CONST
- const
- const
- const
- const
- const
- const
- Const
- const
- const
- const
- CONST
- const
- const
- const
- IOS开发-网络请求方式总结
- Intel 平台编程总结----计时机制
- 颜色迁移之一——基础知识(色彩空间及其转换)
- Windows 中GDI、设备描述表和位图
- Python之easy_install安装出错
- const
- And Then There Was One
- Intel 平台编程总结---自顶向下的软件优化策略
- LeetCode:Maximum Subarray
- 【Leetcode】Pascal's Triangle
- gzip
- 单调队列+DP
- hadoop常见错误及处理方法
- 悲催的实习面试经历