C语言的const/static/extern温故知新

Swift写多了,OC就忘了,最近研究OC的底层C\C++源码,发现很多C的代码修饰符不明确了,又重新问稳固一

一、const (常量)

修饰常量所用

(1)int a = 1; 这是一个int类型的变量a,a可以继续被重新赋值,比如a = 2;是合法有效的

如果写成 cont int  a = 1; 就是一个int类型的常量a,此时a,是不可以被再次赋值

a = 2;❎ 就是不合法的

(2)概念很简单,但是和指针联合使用起来就需要理解记忆, 比如常量指针(常量区的指针)

比如 const int *p 声明一个常量指针,也就是指针p指向的区域是常量区域,类似下面代码

cont int a = 1;

int *p = &a;

这里的指针p指向的区域的值是常量,不可变,不能再次赋值

也就是*p = 2; ❎ 是不合法的

但是指针也就是存放a的地址的区域不是常量区域,可以自由被赋值为其他地址

比如 int b  = 2;

p = &b; ✅

此时p就不指向a内存区了,去指向了b的内存区,*p目前就是2

另外写法上 const int的前后位置可以调整,修饰作用是一样的

也就是说 const int a = 1; 与 int const a = 1;是等效修饰

(3)还有一种是指针常量(指针的常量态),也就是指针区是常量区,不能被重写赋值为其他地址,只能单一指向某一个区域

int a = 1;

int * const   p = &a;

此时只说明的,指针是常量的,但是指向的区域不是常量的,

这里我们理解为p的指针区的值(存的地址)是可读 但是不可写,但是指向的区域的值(a的值)是可读可写的,

这里就有这些的写法了

*p = 20;✅就是合法的,虽然指向的访问被锁死了,但是指向的地方的值我能给你复制替换掉了,此时a==20了

因为指向被锁死,此时p不能被其他变量地址再赋值了,例如下面代码是不合法的

int b = 2;

然后 p = &b; ❎ 

(4)还有一种修饰是及修饰了指针又修饰了指向区都是不可变的常量,怎么修饰呢?

int const * const p  或 const int * const p

此时修饰的是一个常量指针的指针常量 

说白了就是指针值(地址)只读不可写、指针指向的区域 只读不可写


二、static (静态修饰)也就是不是动态的,内存区域一直保留,声明整周跟随整个程序,但是作用时间和局部、全局静态变量有关


void method1(void) {

static int age =0;

age++;

printf("---num=%d---\n",age);

}

method1() 初始化age = 0 age+1 即age == 1

method1() 因为age是在静态区,不会销毁,此时初始化不生效,age+1 即 age == 2了

全局就更简单了,全局函数和方法都可以访问读写,目的是为了避免重复定义全局变量

三、extern (外部) 需要外部引用 不定义只引用

在c中

int metho1(void) {

extern int p,q;

printf("p is %d, q is %d\n",p,q);

return 0;

}

int p=10,q=20;

如果没有extern声明,method1是无法使用的

在另一个文件使用该文件的p和q也是一样,需要extern 声明

你可能感兴趣的:(C语言的const/static/extern温故知新)