OC-語法:static,extern,const修飾符,靜態變量,局部變量,全局變量


一。C語言中的static的做用 ios

在C語言中,static的字面意思很容易把咱們導入歧途,其實它的做用有三條。 程序員

(1)第一個做用:隱藏。 函數

當咱們同時編譯多個文件時,全部未加static前綴的全局變量和函數都具備全局可見性。爲理解這句話,我舉例來講明。咱們要同時編譯兩個源文件,一個是a.c,另外一個是main.c。 spa

下面是a.c的內容 .net

#include<cstdio>增長這條語句 pwa

char a = ‘A‘; // global variable 對象

void msg() blog

{ 生命週期

printf("Hello\n"); 內存

}

你可能會問:爲何在a.c中定義的全局變量a和函數msg能在main.c中使用?前面說過,全部未加static前綴的全局變量和函數都具備全局可見性,其它的源文件也能訪問。此例中,a是全局變量,msg是函數,而且都沒有加static前綴,所以對於另外的源文件main.c是可見的。

若是加了static,就會對其它源文件隱藏。例如在a和msg的定義前加上static,main.c就看不到它們了。利用這一特性能夠在不一樣的文件中定義同名函數和同名變量,而沒必要擔憂命名衝突。Static能夠用做函數和變量的前綴,對於函數來說,static的做用僅限於隱藏,而對於變量,static還有下面兩個做用。

(2)static的第二個做用是保持變量內容的持久。存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是惟一的一次初始化。共有兩種變量存儲在靜態存儲區:全局變量和static變量,只不過和全局變量比起來,static能夠控制變量的可見範圍,說到底static仍是用來隱藏的。

(3)static的第三個做用是默認初始化爲0。其實全局變量也具有這一屬性,由於全局變量也存儲在靜態數據區。在靜態數據區,內存中全部的字節默認值都是0x00,某些時候這一特色能夠減小程序員的工做量。

最後對static的三條做用作一句話總結。首先static的最主要功能是隱藏,其次由於static變量存放在靜態存儲區,因此它具有持久性和默認值0。

下面是main.c的內容

除了頭文件,須要聲明函數:void msg();

int main(void)

{

extern char a; // extern variable must be declared before use

printf("%c ", a);

(void)msg();

return 0;

}

二。靜態變量,局部變量,static,變量的有效範圍和生命週期,可見性


2.1 

static 隱藏做用    賦初值一次,之後值能夠改變,改變一次保存一次之後改變了得值,一個變量能夠由stati進行再說明,而且改變其原有的存儲方式

2.2 

自動變量是局部變量,如不做專門說明爲靜態變量,都是動態分配存儲空間,存儲在動態存儲區中。這種變量叫自動變量。這種變量只在定義它們的時候才建立,在定義它們的函數返回時系統回收變量所佔存儲空間。對這些變量存儲空間的分配和回收是由系統自動完成的,因此也叫自動變量。通常狀況下,不做專門說明的局部變量,均是自動變量   自動變量包括函數形參和非static局部變量,他也不是說動態變量的意思。自動變量說明這個變量是再棧上在運行時自動建立自動撤銷。

2.3 

靜態局部變量和自動變量的區別:它們的共同點是有效範圍都侷限在函數內,不一樣的是生存週期不同,自動變量從進函數開始到退出函數,而靜態變量從程序啓動一直到結束。另外,本質的不一樣是,自動變量在棧中,靜態變量在程序的數據段中。

2.4

局部變量又叫自動變量,是在函數內部聲明或定義的,函數退出後就自動消失了。全局變量是在函數外部定義的,要到程序結束後才能消失。靜態變量也只有局部和全局兩種狀況,但不管哪種狀況,它的值是永久存在的,直到程序結束時才消失。不過它的可見性與相應的自動變量同樣,即局部靜態變量的可見性是函數,而全局靜態變量的可見性是程序。OC的全局靜態變量的可見性只在該類,除非用類方法返回該對象,其餘類才能調用。

2.5

靜態變量固然是屬於靜態存儲方式,可是屬於靜態存儲方式的量不必定就是靜態變量, 例如(全局)外部變量雖屬於靜態存儲方式,但不必定是靜態變量

三。  extern和static的區別

// static  只初始化一次,存儲在靜態區

// extern  傳值  相似於全局變量

// 1:OC中有靜態成員變量,可是沒有類成員變量,也就是說不能使用 Class.Variables 的形式訪問.

// 2:static變量的做用域被限制在定義變量的當前文件中,其它文件是不能訪問的;能夠經過靜態方法返回的方式訪問。

// Static 的做用和其它語言中的不同,全部實例共享同一個變量,不對的呢,沒有這種功能,也不能這樣用。

//extern能夠置於變量或者函數前,以表示變量或者函數的定義在別的文件中,提示編譯器遇到此變量和函數時在其餘模塊中尋找其定義。(另外,extern也可用來進行連接指定,這個沒遇到過,ios暫時不清楚)。

//好比:viewA中定義 NSString *var = @"hello";,寫在.m的@implementation上面

//viewB中這樣定義 extern NSString *var;此時,從A進入B後,B中的var = @"hello"。.m或.h均可以

下面這段程序能夠看出static修飾的局部變量和普通局部變量的區別:

NSLog(@"\n\n\n\n\n\n");

for (int i  = 0 ; i < 3; i++) {

int num1  = 100;

static int num2 = 100;

NSLog(@"\nnum1 = %d", num1);

NSLog(@"\nnum2 = %d", num2);

num1++;

num2++;

NSLog(@"\nnum1加以後%d", num1);

NSLog(@"\nnum2加以後%d", num2);

  NSLog(@"\n\n\n\n");

}

四。

const的做用是使一個變量的值保持不變,關於const,extern和static這三個修飾符的做用查看下面網址

http://blog.csdn.net/xpwang168/article/details/8087143   objectiveC【語法】修飾符 static extern const

相關文章
相關標籤/搜索