指针修饰C语言const修饰符探秘指针修饰
PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!
言前
C言语是我接触的第一门序程设计言语,时当还很傻很无邪,后来敏捷被各种高级言语洗脑,但是不得不说,C的位置真的无可撼动。
const修饰符在C言语中很用常,但是近最读代码的时候常常搞不清楚,索搜了一番,做个结总。
体整认知
const是常量修饰符,代码中想法阻挠量变被转变,这个时候可以应用const关键字。必须在声明const量变就初始化,因此,相似与这样的声明是错误的:
const int i; i = 8;
编译器会报:error: assignment of read-only variable ‘i’。
我们必需要这样:
const int i = 8;
const修饰符的典范作用
- 最基本的,护保被修饰的作用,避免之外改修
- 编译器常通不为const常量配分存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储和读取内存的作操,效率很高
- 使序程中的错误在编译的时候就被报出(因为2)。
面下会一一举例说明。
const修饰符的修饰对象探秘
修饰通普量变
const int i = 8; int const i = 8;
面下两者是等价的,都是声了明一个值为5的常量。
修饰指针
const int *p; int const *p;
面下两个是等价的,都声了明一个const int类型的指针,也就是说,序程里头不能转变*p的值,但是可以转变p的值(即可以转变指针的指向)。
int * const p = &n;
这个是声了明一个const的指针,const是修饰指针的。也即p的值不允许转变(指针就定一得指向n那块内存,不能转变p的指向),但是*p的值可以转变。
小巧技
- const在*的侧左,const修饰指针所指的量变
- const在*的侧右,const修饰指针本身
带const修饰的数函参形
首先要明白一点,非指针参数(值递传)传给数函的是参数的一份拷贝,本身就不会转变参数的值,所以加上const是没有意义的,例如:
#include <stdio.h> void add(const int a) { a = a + 1; } int main() { int temp = 34; add(temp); printf("%d",temp); return 0; }
虽然编译过不去,但是,就算不加const,在数函体中胜利试尝改修了a,但是在本例中temp的值也是变不的,因为数函中改修的是a的一个拷贝(值递传)。
先看这个数函:
void foo(const int * p) { *p += 1; }
编译时就会报错,因为我们试图改修一个常量的值。
带const的参形是不允许在数函体内改修其值的(只读)。
不过一旦这样写就没辙了:
void foo(const int * p) { int *r = p; *r += 1; }
虽然编译器编译时会告知你:warning: initialization discards qualifiers from pointer target type,说你赋值丢了一个性属修饰符,但是运行时还是可以转变p所指向内存的值。
再看这样一个例子:
void foo(int *const p1) { int a = 1; p1 = &a; }
然显编译不过去。这样做本来是想传进来一个const的指针,但实际上,这样是没有意义的。指针作为参数时也是传进去一个指针的拷贝。所以即使不加const,数函体中也是改修的这个“指针的拷贝”。这个数函实际上和本大节扫尾的例子是没区分的(但是这个指针的拷贝所指向的内容可是和被拷贝的西东是一样的)。
可以用面下的图说明:
和这个是相似的:
文章结束给大家分享下程序员的一些笑话语录:
Google事件并不像国内主流媒体普遍误导的那样,它仅仅是中国Z府和美国公司、中国文化和美国文化甚至中国人和美国人之间的关系,是民族主义和帝国主义之间的关系;更重要的是,它就是Z府和公司之间的关系,是权力管制和市场自由之间的关系。从这个意义上说,过度管制下的受害者,主要是国内的企业。Google可以抽身而去,国内的企业只能祈望特区。www.ishuo.cn