作为一个业余程序爱好者,第一次写关于C方面的博客,不知道写啥 上班闲暇之际看了一下2012微软实习的一道题目,顺便拿出来分析分析,学习学习C。
A,11 B,12 C,垃圾值 D,编译不通过
首先来看下 int const* p 这个代表指向常量的指针(指针所指向的值不变,指针可变) 即*p不能被赋值 p可以p++ 所以排除D选项
从上图可以知道,给*p赋值的时候编译出现错误:第8行,这种类型为只读 即*p不能被赋值。
p是变量i的地址,p+1就是变量i的下一个地址(假如i的地址是0004,即p+1的地址是0008,32位int占4字节)
而这个地址的值是不确定的垃圾值 所以选C
在深度解剖书上写的很清楚,再次回忆一下
const是constant的缩写,即恒定不变的意思。即readonly! 修饰的是只读变量。
编译器通常不为普通const只读变量分配存储空间,而是将他们保存在符号表中,这使得它成为一个编译期间的值,没有了存储与读内存的操作,使得它的效率很高。
const定义的只读变量从汇编的角度来看,只是给出了对应的内存地址,而不是像#define 一样给出的立即数,所以const定义的只读变量在程序运行过程中只有一份备份(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个备份。#define宏是编译阶段进行替换,而const修饰的只读变量是在编译的时候确定其值。#define宏没有类型,而const修饰的只读变量具有特定的类型。
再来看看修饰指针
1 const int *p; //p可变,p指向的对象不可变
2 int const *p; //p可变,p指向的对象不可变
3 int *const p; //p不可变,p指向的对象可变
4 const int * const p; //指针p和p指向的对象都不可变
记住这个可以用“省略类型名,const就近原则”
1 可以变成 const *p //const修饰*p,所以*p不能赋值,只读属性 p是指针,可以改变
2 可以变成const *p //和1一样
3 可以变成*const p //const修饰p,p不可变 *p可以改变
4 可以变成const * const p; //p 和 *p 都不能改变
(以上纯属个人理解,如有错误请自行鉴定,参考深度解剖,如需转载请说明出处!)