Swift寫(xiě)多了,OC就忘了,最近研究OC的底層C\C++源碼,發(fā)現(xiàn)很多C的代碼修飾符不明確了,又重新問(wèn)穩(wěn)固一
一、const (常量)
修飾常量所用
(1)int a = 1; 這是一個(gè)int類(lèi)型的變量a,a可以繼續(xù)被重新賦值,比如a = 2;是合法有效的
如果寫(xiě)成 cont int? a = 1; 就是一個(gè)int類(lèi)型的常量a,此時(shí)a,是不可以被再次賦值
a = 2;? 就是不合法的
(2)概念很簡(jiǎn)單,但是和指針聯(lián)合使用起來(lái)就需要理解記憶, 比如常量指針(常量區(qū)的指針)
比如 const int *p 聲明一個(gè)常量指針,也就是指針p指向的區(qū)域是常量區(qū)域,類(lèi)似下面代碼
cont int a = 1;
int *p = &a;
這里的指針p指向的區(qū)域的值是常量,不可變,不能再次賦值
也就是*p = 2; ? 是不合法的
但是指針也就是存放a的地址的區(qū)域不是常量區(qū)域,可以自由被賦值為其他地址
比如 int b? = 2;
p = &b;??
此時(shí)p就不指向a內(nèi)存區(qū)了,去指向了b的內(nèi)存區(qū),*p目前就是2
另外寫(xiě)法上 const int的前后位置可以調(diào)整,修飾作用是一樣的
也就是說(shuō) const int a = 1; 與 int const a = 1;是等效修飾
(3)還有一種是指針常量(指針的常量態(tài)),也就是指針區(qū)是常量區(qū),不能被重寫(xiě)賦值為其他地址,只能單一指向某一個(gè)區(qū)域
int a = 1;
int * const? ?p = &a;
此時(shí)只說(shuō)明的,指針是常量的,但是指向的區(qū)域不是常量的,
這里我們理解為p的指針區(qū)的值(存的地址)是可讀 但是不可寫(xiě),但是指向的區(qū)域的值(a的值)是可讀可寫(xiě)的,
這里就有這些的寫(xiě)法了
*p = 20;?就是合法的,雖然指向的訪(fǎng)問(wèn)被鎖死了,但是指向的地方的值我能給你復(fù)制替換掉了,此時(shí)a==20了
因?yàn)橹赶虮绘i死,此時(shí)p不能被其他變量地址再賦值了,例如下面代碼是不合法的
int b = 2;
然后 p = &b; ??
(4)還有一種修飾是及修飾了指針又修飾了指向區(qū)都是不可變的常量,怎么修飾呢?
int const * const p? 或 const int * const p
此時(shí)修飾的是一個(gè)常量指針的指針常量?
說(shuō)白了就是指針值(地址)只讀不可寫(xiě)、指針指向的區(qū)域 只讀不可寫(xiě)
二、static (靜態(tài)修飾)也就是不是動(dòng)態(tài)的,內(nèi)存區(qū)域一直保留,聲明整周跟隨整個(gè)程序,但是作用時(shí)間和局部、全局靜態(tài)變量有關(guān)
void method1(void) {
static int age =0;
age++;
printf("---num=%d---\n",age);
}
method1() 初始化age = 0 age+1 即age == 1
method1() 因?yàn)閍ge是在靜態(tài)區(qū),不會(huì)銷(xiāo)毀,此時(shí)初始化不生效,age+1 即 age == 2了
全局就更簡(jiǎn)單了,全局函數(shù)和方法都可以訪(fǎng)問(wèn)讀寫(xiě),目的是為了避免重復(fù)定義全局變量
三、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;
如果沒(méi)有extern聲明,method1是無(wú)法使用的
在另一個(gè)文件使用該文件的p和q也是一樣,需要extern 聲明