亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > iOS > 正文

IOS開發(fā)之路--C語言存儲方式和作用域

2020-02-19 15:58:28
字體:
來源:轉載
供稿:網(wǎng)友

概述

基本上每種語言都要討論這個話題,C語言也不例外,因為只有你完全了解每個變量或函數(shù)存儲方式、作用范圍和銷毀時間才可能正確的使用這門語言。今天將著重介紹C語言中變量作用范圍、存儲方式、生命周期、作用域和可訪問性。

變量作用范圍 存儲方式 可訪問性

變量作用范圍

在C語言中變量從作用范圍包括全局變量和局部變量。全局變量在定義之后所有的函數(shù)中均可以使用,只要前面的代碼修改了,那么后面的代碼中再使用就是修改后的值;局部變量的作用范圍一般在一個函數(shù)內部(通常在一對大括號{}內),外面的程序無法訪問它,它卻可以訪問外面的變量。

//// main.c// ScopeAndLifeCycle//// Created by Kenshin Cui on 14-7-12.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include int a=1;void changeValue(){  a=2;  printf("a=%d/n",a);}int main(int argc, const char * argv[]) {  int b=1;  changeValue(); //結果:a=2  printf("a=%d,b=%d/n",a,b); //結果:a=2,b=1 ,因為changeValue修改了這個全局變量  return 0;}

變量存儲方式

C語言的強大之處在于它能直接操作內存(指針),但是要完全熟悉它的操作方式我們必須要弄清它的存儲方式。存儲變量的位置分為:普通內存(靜態(tài)存儲區(qū))、運行時堆棧(動態(tài)存儲區(qū))、硬件寄存器(動態(tài)存儲區(qū)),當然這幾種存儲的效率是從低到高的。而根據(jù)存儲位置的不同在C語言中又可以將變量依次分為:靜態(tài)變量、自動變量、寄存器變量。

靜態(tài)變量

首先說一下存儲在普通內存中的靜態(tài)變量,全局變量和使用static聲明的局部變量都是靜態(tài)變量,在系統(tǒng)運行過程中只初始化一次(在下面的例子中雖然變量b是局部變量,在外部無法訪問,但是他的生命周期一直延續(xù)到程序結束,而變量c則在第一次執(zhí)行完就釋放,第二次執(zhí)行時重新創(chuàng)建)。

//// 2.1.c// ScopeAndLifeCycle//// Created by Kenshin Cui on 14-7-12.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include int a=1; //全局變量存儲在靜態(tài)內存中,只初始化一次void showMessage(){  static int b=1; //靜態(tài)變量存儲在靜態(tài)內存中,第二次調用不會再進行初始化  int c=1;  ++b;  a+=2;  printf("a=%d,b=%d,c=%d/n",a,b,c);}int main(int argc, const char * argv[]) {  showMessage(); //結果:a=3,b=2,c=1  showMessage(); //結果:a=5,b=3,c=1  return 0;}

自動變量

被關鍵字auto修飾的局部變量是自動變量,但是auto關鍵字可以省略,因此可以得出結論:所有沒有被static修飾的局部變量都是自動變量。

//// 1.3.c// ScopeAndLifeCycle//// Created by Kenshin Cui on 14-7-12.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include #include int main(int argc, const char * argv[]) {  int a=1;  auto int b=2;  printf("a=%d,b=%d/n",a,b); //結果:a=1,b=2 ,a和b都是自動變量,auto可以省略    //需要注意的是,上面的自動變量是存儲在棧中,其實還可以存儲到堆中  char c[]="hello,world!";  long len=strlen(c)*sizeof(char)+1;//之所以加1是因為字符串后面默認有一個/0空操作符不計算在長度內  char *p=NULL;//可以直接寫成:char *p;  p=(char *)malloc(len);//分配指定的字節(jié)存放c中字符串,注意由于malloc默認返回“void *”需要轉化  memset(p,0,len);//清空指向內存中的存儲內容,因為分配的內存是隨機的,如果不清空可能會因為垃圾數(shù)據(jù)產(chǎn)生不必要的麻煩  strcpy(p,c);  printf("p=%s/n",p);//結果:p=hello,world!  free(p);//釋放分配的空間  p=NULL;//注意讓p指向空,否則p將會是一個存儲一個無用地址的野指針      return 0;}

當然存儲自動變量的棧和堆其實是兩個完全不同的空間(雖然都在運行時有效的空間內):棧一般是程序自動分配,其存儲結果類似于數(shù)據(jù)結構中的棧,先進后出,程序結束時由編譯器自動釋放;而堆則是開發(fā)人員手動編碼分配,如果不進行手動釋放就只有等到程序運行完操作系統(tǒng)回收,其存儲結構類似于鏈表。在上面的代碼中p變量同樣是一個自動變量,同樣可以使用auto修飾,只是它所指向的內容放在堆上(p本身存放在棧上)。

這里說明幾點:malloc分配的空間在邏輯上連續(xù),物理上未必連續(xù);p必須手動釋放,否則直到程序運行結束它占用的內存將一直被占用;釋放p的過程只是把p指向的空間釋放掉,p中存放的地址并未釋放,需要手動設置為NULL,否則這將是一個無用的野指針;

寄存器變量

默認情況下無論是自動變量還是靜態(tài)變量它們都在內存中,不同之處就是自動變量放在一塊運行時分配的特殊內存中。但是寄存器變量卻是在硬件寄存器中,從物理上來說它和內存處在兩個完全不同的硬件中。大家都是知道寄存器存儲空間很小,但是它的效率很高,那么合理使用寄存器變量就相當重要了。什么是寄存器變量呢?使用register修飾的int或char類型的非靜態(tài)局部變量是寄存器變量。沒錯,需要三個條件支撐:register修飾、必須是int或char類型、必須是非靜態(tài)局部變量。

除了存儲位置不同外,寄存器變量完全符合自動變量的條件,因此它的生命周期其實是和自動變量完全一樣的,當函數(shù)運行結束后它就會被自動釋放。由于寄存器空間珍貴,因此我們需要合理使用寄存器變量,只有訪問度很高的變量我們才考慮使用寄存器變量,如果過多的定義寄存器變量,當寄存器空間不夠用時會自動轉化為自動變量。

//// 1.3.c// ScopeAndLifeCycle//// Created by Kenshin Cui on 14-7-12.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include int main(int argc, const char * argv[]) {  register int a=1;  printf("a=%d/n",a);  return 0;}

上面我們說到變量的存儲類型,其實在C語言中還有兩種存儲類型:常量存儲區(qū)和代碼存儲區(qū),分別用于存儲字符串常量、使用const修飾的全局變量以及二進制函數(shù)代碼。

可訪問性

在C語言中沒有其他高級語言public、private等修飾符,來限定變量和函數(shù)的有效范圍,但是卻有兩個類似的關鍵字能達到類似的效果:extern和static。

externextern作用于變量

我們知道在C語言中變量的定義順序是有嚴格要求的,要使用變量則必須在使用之前定義,extern用于聲明一個已經(jīng)存在的變量,這樣一來即使在后面定義一個變量只要前面聲明了,也同樣可以使用。具體的細節(jié)通過下面的代碼相信大家都可以看明白:

//// 2.1.c// ScopeAndLifeCycle//// Created by Kenshin Cui on 14-7-12.// Copyright (c) 2014年 Kenshin Cui. All rights reserved.//#include //如果在main函數(shù)下面定義了一個變量a,如果在main上面不進行聲明是無法在main中使用a的;//同樣如果只進行了extern聲明不進行定義一樣會報錯,因為extern并不負責定義變量a而僅僅是聲明一個已經(jīng)定義過的變量;//當然如果說在main上面定義int a;去掉main下面的定義同樣是可以的,相當于在上面定義,但如果兩個地方都定義a的話(main上面的extern去掉),則程序認為上面的定義是聲明,只是省略了extern關鍵字;//第一種情況,在下面定義,不進行聲明,報錯int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}int a;//第二種情況,在上面定義,正確int a;int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}//第三種情況,在下面定義在上面聲明,正確extern int a;int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}int a;//第四種情況,只在上面聲明(編譯時沒有問題,因為上面的聲明騙過了編譯器,但運行時報錯,因為extern只能聲明一個已經(jīng)定義的變量),錯誤extern int a;int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}//第五種情況,上下同時定義(這種方式是正確的,因為上面的定義會被認為是省略了extern的聲明),正確int a;int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}int a;//其實下面的情況也是不會出錯的int a;int a;int main(int argc, const char * argv[]) {    printf("a=%d/n",a);  return 0;}int a;int a;//第六種情況,將全局變量聲明為局部變量,但是它的實質還是全局變量,正確int a;int main(int argc, const char * argv[]) {  extern int a;  printf("a=%d/n",a);  return 0;}int a;//第七種情況,在函數(shù)內部重新定義一個變量a,雖然不會報錯,但是兩個a不是同一個int a;int main(int argc, const char * argv[]) {  int a;  printf("a=%d/n",a);//注意這里輸出的a其實是內部定義的a,和函數(shù)外定義的a沒有關系  return 0;}int a;

如果兩個文件同時定義一個全局變量,那實質上他們指的是同一個變量。從下面的例子可以看出,在main.c中修改了變量a之后message.c中的變量a值也修改了。

需要注意,在上面的代碼中無論在message.h中將a定義前加上extern,還是在main.h中的a定以前加上extern結果都是一樣的,extern同樣適用。和在單文件中一樣,不能兩個定義都添加extern,否則就沒有定義了。如果把message.c中a的定義(或聲明)去掉呢,那么它能否訪問main.c中的全局變量a呢,答案是否定的(這和在一個文件中定義了一個函數(shù)在另一個文件不聲明就直接用是類似的)。

extern作用于函數(shù)

extern作用于函數(shù)就不再是簡單的聲明函數(shù)了,而是將這個函數(shù)作為外部函數(shù)(當然還有內部函數(shù),下面會說到),在其他文件中也可以訪問。但是大家應該已經(jīng)注意到,在上面的代碼中message.c中的showMessage前面并沒有添加extern關鍵字,在main.c中不是照樣訪問嗎?那是因為這個關鍵字是可以省略的,默認情況下所有的函數(shù)都是外部函數(shù)。

和作用于變量不同,上面main.c和message.c中的extern都可以省略,在這里extern的作用就是定義或聲明一個外部函數(shù)。從上面可以看到在不同的文件中可以定義同一個變量,它們被視為同一個變量,但是需要指出的是外部函數(shù)在一個程序中是不能重名的,否則會報錯。

staticstatic作用于變量

其實在前面的例子中我們已經(jīng)看到static關鍵字在變量中的使用了,在例子中使用static定了一個局部變量,而且我們強調static局部變量在函數(shù)中只被初始化一次。那么如果static作用于全局變量是什么效果呢?如果static作用于全局變量它的作用就是定義一個只能在當前文件訪問的全局變量,相等于私有全局變量。

從上面的輸出結果可以看出message.c中的變量a和main.c中的變量a并不是同一個變量,事實上message.c中的變量a只能在message.c中使用,雖然main.c中的變量a是全局變量但是就近原則,message.c會使用自己內部的變量a。當然,上面例子中main.c中的變量a定義成靜態(tài)全局變量結果也是一樣的,只是這樣如果還有其他源文件就不能使用a變量了。但是main.c中的a不能聲明成extern,因為main.c不能訪問message.c中的變量a,這樣在main.c中就沒變量a的定義了。

static作用于函數(shù)

static作用于函數(shù)和作用于變量其實是類似的,如果static作用于函數(shù)則這個函數(shù)就是內部函數(shù),其他文件中的代碼不可以訪問。下面的代碼在運行時會報錯,因為mesage.c中的showMessage()函數(shù)是私有的,在main.c中盡管進行了聲明,可以在編譯階段通過,但是在鏈接階段會報錯。

總結

最后做一下簡單總結一下:

extern作用于變量時用于聲明一個已經(jīng)定義的變量,但是并不能定義變量;使用extern你可以在其他文件中使用全局變量(當然此時extern可以省略); extern作用于函數(shù)時與它作用于全局變量有點類似,聲明這個函數(shù)是外部函數(shù),其他文件可以訪問,但不同的是當它作用于函數(shù)時不僅可以聲明函數(shù)還可以定義函數(shù)(用在函數(shù)定義前面),不管是定義還是聲明都可以省略,C語言默認認為函數(shù)定義或聲明都是外部函數(shù); static作用于變量時,該變量只會定義一次,以后在使用時不會重新定義,當static作用于全局變量時說明該變量只能在當前文件可以訪問,其他文件中不能訪問; static作用于函數(shù)時與作用于全局變量類似,表示聲明或定義該函數(shù)是內部函數(shù)(又叫靜態(tài)函數(shù)),在該函數(shù)所在文件外的其他文件中無法訪問此函數(shù);

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
99精品黄色片免费大全| 成人av资源| 国产69精品久久久久9999| 欧美日产国产成人免费图片| 成人性生交大片| 欧美videossexotv100| 中国极品少妇videossexhd| h视频网站在线观看| 无码人妻精品一区二区三区温州| 免费日韩中文字幕| 国产精品亚洲lv粉色| 日韩精品一区二区三区高清免费| 久久资源亚洲| 2021国产在线| 老司机午夜免费福利视频| 99国产超薄肉色丝袜交足的后果| 国产精品麻豆| 91在线精品| 欧美专区视频| 久久久久亚洲AV成人无在| 婷婷中文字幕在线观看| 国产黄色片大全| 日韩精品视频三区| 欧亚乱熟女一区二区在线| 亚洲女人在线观看| 国产又粗又猛又色| 91片在线免费观看| 成人毛片在线| 国产99久久久精品| 成本人h片动漫网站在线观看| 色视频www在线播放国产人成| 精人妻一区二区三区| 日韩高清有码在线| 国产精品毛片一区视频播| 伊人久久久大香线蕉综合直播| 一区二区三区欧美日| 色综合天天综合网国产成人综合天| 成人国产精品免费观看| 你懂的亚洲视频| 欧美另类高清videos| 一区二区乱子伦在线播放| 国产精品一区二区三区在线观| 日本欧美黄网站| 写真福利片hd在线播放| 官网99热精品| 欧美精品日日操| 精品人人人人| 老湿机69福利| 视频一区视频二区中文| 成人国产精品一级毛片视频| 欧美国产中文字幕| 欧美久久久久久久久中文字幕| 国产极品模特精品一二| 日本五级黄色片| 九九热青青草| 99视频在线观看一区三区| 亚洲啪啪综合av一区二区三区| 亚洲成人中文字幕| 日韩欧乱色一区二区三区在线| 综合在线亚洲| 中文乱码字幕高清在线观看| 奇米成人av国产一区二区三区| 最新av网址在线观看| 一级黄色录像在线观看| 精品国产乱码久久久久软件| 欧美日韩三级| 欧美日韩国产页| 四虎精品永久免费| 久久精品国产69国产精品亚洲| 亚洲av片不卡无码久久| 中文字幕中文乱码欧美一区二区| 亚洲精品成a人在线观看| 国产盗摄精品一区二区酒店| 成人污网站在线观看| 欧美一区1区三区3区公司| 私人玩物在线观看| 亚洲人成电影在线播放| 影音先锋黄色资源| 又黄又爽又色视频| 亚洲国产成人无码av在线| 亚洲高清国产精品| 国产精品久久久久7777婷婷| 激情在线观看视频| 亚洲精品高清无码视频| 国产jizz18女人高潮| 99久久精品免费看国产一区二区三区| 视频二区不卡| www红色一片_亚洲成a人片在线观看_| 欧美专区视频| 人人澡人一摸人人添| 欧美午夜精品久久久久久超碰| 日色在线视频| 黄色网一区二区| 国产精品网站入口| 青青青视频在线| 国产精品传媒毛片三区| 日本视频在线免费| 精品国产一区二区三| 情侣偷拍对白清晰饥渴难耐| 老汉av免费一区二区三区| 精品污污网站免费看| gogogo影视剧免费观看在线观看| 亚洲r级在线视频| 97国产在线| 亚洲已满18点击进入久久| 国产在线高潮| 性欧美大胆高清视频| 久久久久99精品成人片我成大片| av在线二区| 一本久道久久综合中文字幕| www久久精品| 91精品在线观| 成年网站在线在免费播放| 精品无码国产污污污免费网站| 欧美午夜精品久久久久久久| 偷拍视频一区二区| 成人爽a毛片免费啪啪动漫| 国产精品普通话对白| 亚洲成人国产综合| 国产一级二级三级在线观看| 女人又爽又黄免费女仆| 欧美成人禁片在线www| 国产蜜臀97一区二区三区| 国产成人一区二区三区小说| 少妇一级淫免费放| 国产精品115| 国产黄色一区二区| 国产免费一区二区三区在线能观看| 欧美777四色影| 国产精品亚洲美女av网站| 欧美日韩在线视频一区| 石原莉奈在线亚洲二区| 色综合视频一区二区三区日韩| 日韩欧美三级一区二区| 国产精品久久久久久久无码| 国产情侣免费视频| 国产在线一区二| av在线免费播放| 一区二区三区高清在线观看| 可播放的18gay1069| 女子免费在线观看视频www| 永久免费毛片在线播放不卡| jizzjizzjizz孕妇| 亚洲系列第一页| 欧美日韩无遮挡| 一区二区三区精品视频在线| wwwxxx色| 多男操一女视频| 麻豆av一区| 国产福利91精品一区二区| 久草在线免费资源站| 中文字幕高清一区| 日韩欧美成人免费视频| 欧美在线观看一区二区三区| 国产精品免费福利| 国产午夜精品一区理论片| 欧美一区二区三区黄片| 日本高清视频一区二区| 精品精品国产高清a毛片牛牛| 久久久久一本一区二区青青蜜月| 国产又爽又黄网站亚洲视频123| 亚洲久久久久久久久久久| 黄动漫在线观看| 国产精品吹潮在线观看| 毛片免费在线观看| 日韩电影在线视频| 午夜国产精品视频免费体验区| 黄色国产在线观看| 欧美激情办公室videoshd| 精品91免费| 国产日韩一区在线| 日韩aaaa| 黄色电影免费在线看| 欧美韩国日本在线观看| 免费不卡欧美自拍视频| 性欧美精品孕妇| www.三级.com| 亚洲一区二区激情| 中文在线免费看视频| 久久影院视频免费| 男男互摸gay网站| 国产精品探花一区二区在线观看| 国产亚洲精品久久| 免费特级黄色片| 国产v综合v亚洲欧| 日韩网站在线播放| 久久久久久久色| 人妻av一区二区| 亚洲人成在线观看网站高清| 日韩欧美美女在线观看| 日韩av中字| 国产麻豆成人传媒免费观看| 久久久久亚洲av无码麻豆| 亚洲第一福利在线观看| 国产精品久久久久9999小说| 中文字幕久热精品在线视频| 欧美一级小视频| 粉嫩嫩av羞羞动漫久久久| 欧美一区二区影视| 在线日本视频| 亚洲一区二区三区在线免费观看| 亚洲三级 欧美三级| 亚洲激情中文字幕| av中文在线资源库| 国产主播性色av福利精品一区| 亚洲精品在线a| 欧美丝袜一区| h片视频在线观看| 国产精品自拍电影| 成人视屏免费看| 99日韩精品| 日韩精品资源| gogo亚洲高清大胆美女人体| 色天使综合视频| free性中国hd国语露脸| 美女视频一区二区三区在线| 蜜桃999成人看片在线观看| 国产中文字幕二区| 亚洲国产天堂| 欧美在线观看视频网站| 日本一本二本在线观看| 久久精品成人欧美大片古装| 丝袜a∨在线一区二区三区不卡| 日韩av电影在线网| 亚洲+变态+欧美+另类+精品| 亚洲天堂手机版| 国产999在线观看| 99久久伊人久久99| 日韩久久免费av| 一区二区三区四区五区视频| 97超超碰碰| 亚洲视频免费在线| 夜夜狂射影院| eeuss免费天堂影院| 久久社区一区| 精品国产乱子伦一区| 在线视频中文字幕第一页| 樱桃视频免费看| 亚洲成人av影片| 97欧美在线视频| 成人免费一区二区三区视频| 中文字幕免费观看| 一区二区电影免费观看| 欧美久久久久久久久中文字幕| 日韩av高清在线观看| 一二三区在线视频| 精品电影一区二区三区| 欧美日韩一区在线播放| 亚洲特色特黄| 欧美成人在线网站| 黄色短视频在线观看| 色偷偷男人天堂| 在线视频一区二区三区在线播放| 国产精品白丝av嫩草影院| 国产寡妇树林野战在线播放| 少妇久久久久| 亚洲mmav| 亚洲永久免费视频| 国产精品亚洲一区二区三区在线| 日韩精品视频观看| 天堂аⅴ在线最新版在线| 久久久久久九九九九九| 欧美视频在线视频| 久久悠悠精品综合网| 亚洲乱码国产乱码精品精天堂| 成人国产一区二区| 欧洲国产精品| 国产永久免费网站| 青青青在线免费观看| 欧美精品日韩在线| 久久国产午夜精品理论片最新版本| 麻豆一区产品精品蜜桃的特点| 日韩在线一区二区三区| 成年人视频网站| 欧美偷拍第一页| 国产性生活大片| 日精品一区二区| 在线免费看91| 日韩免费精品| 猫咪av在线| 在线精品视频一区二区| 91嫩草在线视频| 久热国产在线视频| 一区二区三区四区在线免费视频| 国产精品中文字幕亚洲欧美| 国产三级国产精品国产专区50| 91精品国产电影| 中文字幕在线一区免费| 国产欧美一区二区精品忘忧草| 精品欧美日韩精品| 午夜天堂影视香蕉久久| 舐め犯し波多野结衣在线观看| 成人av资源网站| 性少妇videosexfreexxx片| 日本熟妇人妻中出| 日韩一级裸体免费视频| 精品久久久久久久久久久久| 久草综合在线视频| 日本猛少妇色xxxxx免费网站| 日韩电影免费在线观看| 久久久久久久久久久久久久一区| 免费视频拗女稀缺一区二区| 国产精品成人网| 中文字幕被公侵犯的漂亮人妻| 亚洲精品国产一区二区三区四区在线| 天天干天天操天天干天天操| 伊人天天综合| www.成人在线.com| 日本性爱视频在线观看| 99精产国品一二三产品香蕉| 国产精品果冻传媒潘| 新片速递亚洲合集欧美合集| 欧美插插视频| 精品自拍视频在线观看| 成人av资源| 亚洲日本成人网| 国产性色视频| 欧美精品 国产精品| 一区二区三区高清在线| 夜夜嗨av禁果av粉嫩avhd| 亚洲天堂国产精品| 亚洲女同一区二区| 亚洲女成人图区| 亚洲第一天堂| 欧美精品 日韩| 久久激情综合| 欧美大片一区二区| 四虎国产成人精品免费一女五男|