精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

學了這么久的C,作用域,存儲器,鏈接屬性該弄清楚了

開發 后端
這些是編程語言中的基本概念,如果你還不是非常明確地清楚標題的問題,并且不知道作用域,鏈接屬性,存儲期等概念的具體含義,那么本文你不該錯過。

[[352572]]

本文轉載自微信公眾號「編程珠璣」,作者守望先生。轉載本文請聯系編程珠璣公眾號。  

前言

這些是編程語言中的基本概念,如果你還不是非常明確地清楚標題的問題,并且不知道作用域,鏈接屬性,存儲期等概念的具體含義,那么本文你不該錯過。為了更加清晰的理解我們的問題,需要先了解三個概念:作用域,鏈接屬性,存儲期。

作用域

C語言中,作用域用來描述標識符能夠被哪些區域訪問。

而常見作用域有以下幾種:

  • 塊作用域,可見范圍是從定義處到包含該定義的塊結尾
  • 函數作用域,goto語句的標簽就具有函數作用域
  • 文件作用域,從定義處到定義該文件的末尾都可見。定義在函數之外的變量,就具有文件作用域了。
  • 函數原型作用域,從形參定義處到原型聲明結束

為了便于說明,我們來看一個例子,就很容易理解了:

  1. /**************************** 
  2. 作者:守望先生 
  3. 來源:公眾號編程珠璣 
  4. 個人博客:https://www.yanbinghu.com 
  5. ***************************************/ 
  6. #include <stdio.h> 
  7. int num1 = 222;         //定位在函數外,具有文件作用域 
  8. static int num2 = 111;  //定義在函數外,具有文件作用域 
  9. int swap(int *a,int *b); //這里的a,b是函數原型作用域 
  10. int swap(int *a,int *b) 
  11.     if(NULL== a || NULL == b) 
  12.         goto error;     
  13.     else 
  14.     { 
  15.         int temp = *a;  //定義在函數內,塊作用域 
  16.         *a = *b; 
  17.         *b = temp
  18.         return 0; 
  19.     } 
  20.     //printf("temp is %d\n",temp);   //因為temp具有塊作用域,因此在這里不能直接使用 
  21.     error://goto語句的標簽,函數作用域,因此在前面就可以引用 
  22.         { 
  23.             printf("input para is NULL\n"); 
  24.             return -1; 
  25.         } 
  26. int main(void) 
  27.     printf("num1=%d,num2=%d\n",num1,num2); 
  28.     swap(&num1,&num2);  //num1 num2具有文件作用域,可以在main函數中直接使用 
  29.     printf("num1=%d,num2=%d",num1,num2); 
  30.     return 0; 

可以看到,error標簽具有函數作用域,整個函數內都可見,而temp具有塊作用域,因此在大括號外部,不能直接使用它。而num1和num2具有文件作用域,因此main函數可以直接使用它。

鏈接屬性

在《hello程序是如何變成可執行文件的》我們說到了編譯的過程,最后一個步驟就是鏈接。鏈接屬性決定了在不同作用域的同名標識符能否綁定到同一個對象或者函數。或者說,不同作用域的標識符在編譯后是否是同一個實體。

c變量有三種鏈接屬性:

  • 外部鏈接,extern修飾的,或者沒有static修飾的具有文件作用域的變量具有外部鏈接屬性
  • 內部鏈接,static修飾的具有文件作用域的變量具有內部鏈接屬性
  • 無鏈接,塊作用域,函數作用域和函數原型作用域的變量無鏈接屬性

再稍作解釋,沒有static修飾,且具有文件作用域的變量,他們在鏈接時,多個同名標識符的變量最終都綁定到同一個實體。而static修飾的具有文件作用域的變量就不一樣了,不同文件內,即便標識符名字相同,它們也綁定到了不同的實體。

因此,如果我們希望某個變量或函數只在某一個文件使用,那么使用static修飾是一個很好的做法。

同樣的,來看一個例子。

  1. /**************************** 
  2. 作者:守望先生 
  3. 來源:公眾號編程珠璣 
  4. 個人博客:https://www.yanbinghu.com 
  5. ***************************************/ 
  6. #include <stdio.h> 
  7. int a = 5;   //文件作用域,外部鏈接屬性,其他文件可通過extern int a的方式使用該文件的a 
  8. static b = 6;  //文件作用域,內部鏈接屬性,即便其他文件也有同名標識符,它們也是不同的 
  9. int main(void) 
  10.     int sum = 0 ; //無鏈接屬性 
  11.     sum = a + b; 
  12.     printf("sum is %d\n",sum); 
  13.     return 0; 

從代碼中可以看到,a和b都具有文件作用域,a具有外部鏈接屬性,而b具有內部鏈接屬性,sum具有塊作用域,因此無鏈接屬性。

存儲期

實際上作用域和鏈接屬性都描述了標識符的可見性,而存儲期則描述了這些標識符對應的對象的生存期。存儲期,也分下面幾種:

  • 靜態存儲期,程序執行期間一直都在,文件作用域的變量具有靜態存儲期
  • 自動存儲期,它(變長數組除外)從塊開始,到塊末尾,因此,塊作用域的變量具有自動存儲期,它在棧中存儲,需要顯式初始化。
  • 動態分配存儲期,即通過malloc分配內存的變量。它在堆中存儲,需要顯式初始。
  • 線程存儲期,從名字可以知道, 它與線程相關,使用關鍵字_Thread_local聲明的變量具有線程存儲期,它從聲明到線程結束一直存在。
  • 關于初始化,可參考《C語言入坑指南-被遺忘的初始化》。

同樣地,我們通過下面的代碼來更好地理解存儲期

  1. /**************************** 
  2. 作者:守望先生 
  3. 來源:公眾號編程珠璣 
  4. 個人博客:https://www.yanbinghu.com 
  5. ***************************************/ 
  6. #include <stdio.h> 
  7. int num1 = 222;         //靜態存儲期 
  8. static int num2 = 111;  //靜態存儲期 
  9. int add(int a,int b) 
  10.     static int tempSum = 0;  //靜態存儲期 
  11.     tempSum = tempSum + a + b; 
  12.     return tempSum; 
  13. int main(void) 
  14.     printf("num1=%d,num2=%d\n",num1,num2); 
  15.     int sum = 0;  //自動存儲期 
  16.     sum = add(num1,num2); 
  17.     printf("first time sum=%d\n",sum);//sum = 333 
  18.     sum = add(num1,num2); 
  19.     printf("second time sum=%d\n",sum); //sum = 666 
  20.     return 0; 

另外,如果我們通過nm命令查看編譯出來的程序文件的符號表,我們可以找到num1,num2,tempSum,而沒有sum,前者所用的內存數量在編譯時就確定了。

  1. $ gcc -g -o lifetime lifetime.c  
  2. $ nm lifetime|grep num1 
  3. 0000000000601038 D num1 
  4. $ nm lifetime|grep num2 
  5. 000000000060103c d num2 
  6. $ nm lifetime|grep tempSum 
  7. 0000000000601044 b tempSum.2289 
  8. $ nm lifetime|grep sum 

什么全局變量,局部變量,靜態局部變量,靜態全局變量

到這里,我們就可以很容易區分上面的變量類型了。實際上這里只是換了一種說法:

全局:具有文件作用域的變量

靜態:具有靜態存儲期或內部鏈接屬性

局部:具有函數或塊作用域的變量

因而結合起來,也就很好理解了。

  • 局部變量:函數或塊作用域的變量
  • 靜態局部變量:函數或塊作用域,靜態存儲期
  • 全局變量:具有文件作用域的變量
  • 靜態全局變量:內部鏈接屬性的,具有文件作用域的變量

當然,這僅僅是為了區分它們,這并不是它們的嚴格定義。更好的方法,是通過代碼來理解:

  1. #include <stdio.h> 
  2. int num1 = 222;         //全局變量 
  3. static int num2 = 111;  //靜態全局變量 
  4. int add(int a,int b) 
  5.     static int tempSum = 0;  //靜態局部變量 
  6.     tempSum = tempSum + a + b; 
  7.     return tempSum; 
  8. int main(void) 
  9.     printf("num1=%d,num2=%d\n",num1,num2); 
  10.     int sum = 0;  //局部變量 
  11.     sum = add(num1,num2); 
  12.     printf("first time sum=%d\n",sum);//sum = 333 
  13.     return 0; 

總結

本文總結如下:

  • 具有文件作用域的變量具有靜態存儲期,并且具有鏈接屬性
  • 不希望其他文件訪問的文件作用域變量最好使用static修飾
  • static關鍵字的含義需要結合上下文來理解
  • 如果可以,全局變量應該盡量避免使用,因為它可能帶來變量被意外修改
  • 使用動態內存通常比棧內存慢,但是棧內存很有限

參考

https://en.wikipedia.org/wiki/Global_variables

https://en.wikipedia.org/wiki/Local_variable

《C11標準文檔》

作者:守望,linux應用開發者,目前在公眾號【編程珠璣】分享Linux/C/C++/數據結構與算法/工具等原創技術文章和學習資源。

 

責任編輯:武曉燕 來源: 編程珠璣
相關推薦

2021-05-09 22:26:36

Python函數變量

2017-03-31 15:30:09

2020-02-15 15:33:55

Python如何運作

2022-04-07 08:37:05

鏈表技巧單鏈表

2021-05-27 21:18:56

谷歌Fuchsia OS操作系統

2020-03-30 09:22:03

AI語音技術機器視覺

2020-02-18 16:48:48

大腦CPU包裝

2018-06-08 10:12:10

Web緩存體系服務器

2021-03-11 15:49:44

人工智能深度學習

2022-05-30 08:05:11

架構

2012-05-28 10:06:05

項目開發項目管理開發

2021-03-19 14:12:24

2024-12-10 13:00:00

C++引用

2022-02-08 13:39:35

LinuxUNIX系統

2024-01-12 08:26:16

Linux磁盤文件系統

2019-10-29 09:41:54

Kafka分布式

2021-03-22 09:27:44

PythonEXCEL熱點推薦

2019-08-26 10:36:38

Python操作系統高考

2021-05-28 06:16:28

藍牙Wi-FiNFC

2021-04-28 11:35:06

Java框架日志
點贊
收藏

51CTO技術棧公眾號

人成在线免费视频| 日韩精品一区二区三| 亚洲欧洲专区| 亚洲午夜激情网站| 精品国产综合区久久久久久| 亚洲黄网在线观看| 希岛爱理一区二区三区| 精品国产乱子伦一区| 成人一区二区三| av大全在线| 2019国产精品| 91视频国产高清| 福利网址在线观看| 亚洲精品成人| 国产亚洲欧洲在线| 成人做爰www看视频软件| 成人欧美magnet| 亚洲免费视频中文字幕| 久久天天狠狠| 超碰在线观看99| 青青国产91久久久久久| 性欧美激情精品| 国产尤物在线播放| 妖精一区二区三区精品视频| 制服丝袜av成人在线看| 无码播放一区二区三区| 直接在线观看的三级网址| 国产欧美日产一区| 激情五月综合色婷婷一区二区| 一级黄色短视频| 午夜在线精品偷拍| 欧美高清第一页| 九九这里只有精品视频| 羞羞答答一区二区| 精品久久人人做人人爽| 中文字幕1234区| av亚洲一区| 一本色道久久综合狠狠躁的推荐| 国产精品久久久久9999爆乳| 免费观看在线午夜影视| 中文字幕欧美激情一区| 麻豆成人在线播放| 高清乱码毛片入口| 国产成人综合在线| 2022国产精品| 国产农村妇女毛片精品| 蜜桃视频一区二区| 国产精品日韩一区| 中文亚洲av片在线观看| 三级久久三级久久| 久久免费精品视频| 久久97人妻无码一区二区三区| 婷婷伊人综合| 久久久久999| 疯狂撞击丝袜人妻| 久久亚洲国产| 日韩在线视频中文字幕| 中文字幕求饶的少妇| 青青草91久久久久久久久| 亚洲男人天堂2019| 欧美人与性囗牲恔配| 国产精品日韩精品中文字幕| 日韩精品999| 大又大又粗又硬又爽少妇毛片 | 不卡一卡2卡3卡4卡精品在| 国产又黄又粗又长| 国产一区二区三区在线看麻豆| 91精品久久久久久综合乱菊| 一区二区三区黄| 国产制服丝袜一区| 成人动漫在线观看视频| www.国产精品视频| www.成人在线| 玛丽玛丽电影原版免费观看1977| 青青国产在线| 亚洲国产精品成人综合| 亚洲第一页在线视频| a级影片在线| 午夜av一区二区| 北条麻妃av高潮尖叫在线观看| 99久久伊人| 日韩欧美另类在线| 视频免费在线观看| 国产成人黄色| 乱亲女秽乱长久久久| 九九热这里有精品视频| 夜夜嗨一区二区| 国产成人精品亚洲精品| 一级片aaaa| 菠萝蜜视频在线观看一区| 久久久人人爽| 日本天堂在线观看| 性做久久久久久久久| 自拍偷拍 国产| 欧美日韩黄网站| 精品视频久久久久久| jizzjizz日本少妇| 亚洲视频久久| 国产精品久久久久久久av电影| 99热这里只有精品5| eeuss鲁片一区二区三区在线观看| 欧美连裤袜在线视频| 国产三区在线观看| 狠狠躁夜夜躁久久躁别揉| 成人日韩在线视频| 精品少妇一区| 色yeye香蕉凹凸一区二区av| 久久久久久久久久99| 日韩中文字幕av电影| 99久久精品免费看国产四区| av电影在线播放高清免费观看| 亚洲综合精品自拍| 视频在线观看免费高清| 欧美激情99| 米奇精品一区二区三区在线观看| av网站中文字幕| 国产成人av在线影院| 天堂精品视频| 一个人www视频在线免费观看| 666欧美在线视频| 亚洲AV无码成人精品区明星换面| 国产精品黄色| 亚洲free性xxxx护士白浆| 欧美在线日韩在线| 久久久免费看片| 亚洲经典在线| 不卡的av一区| 97影院秋霞午夜在线观看| 在线观看免费视频综合| 精品人妻一区二区三区香蕉| 欧美日韩一卡| 91精品视频专区| www.亚洲免费| 在线视频欧美区| 黄瓜视频污在线观看| 欧美日韩国产探花| 成人高h视频在线| 日韩a在线观看| 黄网站色欧美视频| a级大片免费看| 欧美色爱综合| 欧美一区二三区| 91麻豆成人精品国产免费网站| 91蜜桃婷婷狠狠久久综合9色| 特级黄色录像片| 国产激情欧美| 国产一区二区三区在线视频| 免费看日韩毛片| 99久久99久久免费精品蜜臀| 九一免费在线观看| av日韩一区| 综合网日日天干夜夜久久| 69成人免费视频| 99热精品国产| 久久久久久人妻一区二区三区| 伊人久久大香| 久久国产精品久久久| 中文资源在线播放| 久久你懂得1024| 国产欧美高清在线| 日韩精品免费一区二区夜夜嗨 | 水蜜桃精品av一区二区| 国产精品wwww| 天天在线视频色| 欧美日韩aaa| 青青青视频在线免费观看| 日韩av中文字幕一区二区| 欧美一级片免费观看| 高清不卡亚洲| www.欧美三级电影.com| 在线视频你懂得| 中文字幕在线一区免费| 中文字幕 日韩 欧美| 天天综合一区| 国产大片精品免费永久看nba| 高清日韩av电影| 欧美日韩一本到| 国产精品18在线| 精品一区二区国语对白| 亚洲国产精品一区二区第四页av| 日韩中文视频| 久久电影一区二区| 亚洲精品字幕在线| 午夜日韩在线观看| 人妻无码一区二区三区| 麻豆久久精品| 国产高清免费在线| 亚洲免费一区三区| 5278欧美一区二区三区| 精品av中文字幕在线毛片| 日本韩国一区二区| 免费在线观看日韩| 不卡的电视剧免费网站有什么| 国产欧美在线一区| 久久视频在线| 国产精品福利视频| 丝袜国产在线| 亚洲欧美在线一区二区| 中文字幕91爱爱| 亚洲欧美日韩国产综合在线| 美女流白浆视频| 玖玖在线精品| 性一交一乱一伧国产女士spa| 欧洲亚洲视频| 国产在线精品自拍| 国产伦理精品| 日韩一区二区av| 青青草免费观看免费视频在线| 精品视频在线免费看| 久久婷婷国产麻豆91| 国产婷婷色一区二区三区在线| www.cao超碰| 在线亚洲一区| 无码熟妇人妻av在线电影| 国产成人1区| 丁香五月网久久综合| 深夜成人福利| 久久久国产成人精品| 可以在线观看的黄色| 日韩精品中文字幕一区二区三区| 精品国产午夜福利| 一区二区三区免费看视频| 国精品无码人妻一区二区三区| 国产99久久久国产精品潘金| 嫩草av久久伊人妇女超级a| 国产精品mm| 亚洲综合激情五月| 日本久久成人网| 国产精品久久久久久免费观看 | 午夜精品视频在线观看| 激情无码人妻又粗又大| 久久久久久久国产精品影院| 污污的网站免费| 免费视频一区二区| 久草青青在线观看| 国产综合色产| 在线无限看免费粉色视频| 日韩高清影视在线观看| 激情视频一区二区| julia中文字幕一区二区99在线| 国产精品视频免费在线观看| 神马久久午夜| 韩剧1988在线观看免费完整版| 欧美午夜大胆人体| 久久精品国产69国产精品亚洲| 久草福利在线| 亚洲国产成人爱av在线播放| 国产男女裸体做爰爽爽| 91精品国产色综合久久不卡电影 | 欧美一级大片视频| 黄网站在线观| 久久精品视频va| 天天在线视频色| 在线视频亚洲欧美| 国产三级电影在线| 在线观看日韩专区| 北条麻妃在线| 色哟哟网站入口亚洲精品| 第一页在线观看| 国产亚洲在线播放| 日本天堂在线| 在线播放精品一区二区三区 | 日本视频网站在线观看| 欧美日韩国产中文精品字幕自在自线| 欧美日韩乱国产| 欧美网站在线观看| 久久成人在线观看| 一区二区三区日韩精品视频| 国产乡下妇女做爰视频| 亚洲国产日产av| 亚洲视频免费播放| 欧美日韩亚洲一区二区| 超碰在线97观看| 在线观看不卡一区| 亚洲综合精品国产一区二区三区 | 欧美wwwwww| 乱一区二区三区在线播放| 欧美日韩中字| 最新精品视频| 欧美日韩一区自拍| 丁香花在线影院观看在线播放| 免费一级欧美片在线播放| 成人观看免费完整观看| 日本一不卡视频| 潘金莲激情呻吟欲求不满视频| 日日摸夜夜添夜夜添亚洲女人| 奇米视频7777| 成人免费高清视频| theav精尽人亡av| 国产精品美女久久久久aⅴ| 青青草偷拍视频| 激情久久av一区av二区av三区| 青青青国产在线 | 欧美国产乱视频| 亚洲小少妇裸体bbw| 国产精品美女999| 试看120秒一区二区三区| 久久亚洲国产精品日日av夜夜| 欧美日韩国产一区二区三区不卡 | 欧美大片一区| 国产精品无码av在线播放| 蜜桃在线一区二区三区| 日韩av影视大全| 国产精品自产自拍| 韩国女同性做爰三级| 亚洲免费视频成人| 久久久久久在线观看| 欧美一级午夜免费电影| 国产在线观看免费网站| 欧美巨大黑人极品精男| 亚洲私拍视频| 97久久人人超碰caoprom欧美| 欧美精品中文| 亚洲成人动漫在线| 久久亚洲图片| 国产清纯白嫩初高中在线观看性色| 99精品欧美一区二区三区小说| jizz18女人高潮| 午夜精品久久久久| 国产精品羞羞答答在线| 亚洲欧美日本另类| 24小时免费看片在线观看 | 国产福利91精品一区二区| 国产精品视频免费一区| 国产尤物久久久| 日韩精品视频久久| 国产黄人亚洲片| 91狠狠综合久久久久久| 一区二区三区久久| 国产免费无遮挡| 中文字幕精品久久久久| 欧美男人天堂| 国产精品一区二区av| 五月久久久综合一区二区小说| cao在线观看| 国产精品亚洲视频| 黄色精品视频在线观看| 日韩欧美精品网址| 少妇性bbb搡bbb爽爽爽欧美| 欧美成人小视频| 综合欧美精品| 亚洲巨乳在线观看| 美女脱光内衣内裤视频久久影院| 成人精品在线观看视频| 亚洲成va人在线观看| 亚洲一区二区影视| 日韩在线高清视频| 看片一区二区| 欧美在线一二三区| 亚洲区一区二| 美国黄色一级毛片| 欧美日韩免费在线观看| 精品毛片在线观看| 久久综合伊人77777尤物| 国产区一区二| 日本久久高清视频| 国产一区中文字幕| 一本在线免费视频| 91麻豆精品国产91久久久更新时间| 91啦中文在线| 国产日韩欧美黄色| 欧美jizzhd精品欧美巨大免费| 在线播放黄色av| 亚洲精品第1页| www久久久com| 2018日韩中文字幕| 亚洲综合图色| 亚洲黄色小视频在线观看| 亚洲欧美在线高清| av高清一区二区| 九九热在线精品视频| 成人爽a毛片| 欧洲熟妇精品视频| 中文字幕不卡在线| 91福利在线观看视频| 日韩专区中文字幕| 欧美日韩黄网站| 国产一级爱c视频| 久久久美女毛片| 国产三级漂亮女教师| 欧美激情视频一区二区三区不卡 | 久久国产精品毛片| av电影网站在线观看| 欧美日韩一级大片网址| 日本电影全部在线观看网站视频 | 里番精品3d一二三区| 凹凸国产熟女精品视频| 国产日韩欧美亚洲| 精品人妻无码一区二区| 国语自产精品视频在线看抢先版图片 | 99re8这里有精品热视频8在线| 欧美色图色综合| 国产精品每日更新在线播放网址| av中文字幕播放| 热久久视久久精品18亚洲精品| 日韩一区三区| 国产艳妇疯狂做爰视频| 欧美日韩国产综合新一区| 午夜在线视频| 国产一区免费观看|