激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 深度解析C語言中的變量作用域、鏈接和存儲期的含義

深度解析C語言中的變量作用域、鏈接和存儲期的含義

2021-11-11 15:20從善若水 C/C++

錯誤的定義C語言變量的作用域、鏈接和存儲區(qū)在某種程度上會直接影響程序的設計,我們通過這篇博文介紹如何正確合理的定義一個C變量,感興趣的朋友跟隨小編一起學習吧

在c中變量有三種性質:
1、存儲期限:變量的存儲期限決定了變量占用的內存空間什么時候會被釋放,具有動態(tài)存儲期限的變量會在所屬的程序塊被執(zhí)行時獲得內存空間,在結束時釋放內存空間。具有靜態(tài)存儲期限的變量在程序運行的整個期間都會占用內存空間。
2、作用域:變量有塊作用域也有文件作用域,結合序章第一張圖可以明白塊作用域是在某些程序塊內起作用,文件作用域是在整個c文件之內起作用。
3、鏈接:鏈接是各個文件之間的關系,具有內部鏈接的變量只在本文件內起作用,具有外部鏈接的變量可以在不同文件內起作用。具有無鏈接的變量只在某一個文件的某個函數內起作用。

深度解析C語言中的變量作用域、鏈接和存儲期的含義

C變量作用域、鏈接和存儲期的含義

錯誤的定義C語言變量的作用域、鏈接和存儲區(qū)在某種程度上會直接影響程序的設計,我們通過這篇博文介紹如何正確合理的定義一個C變量。

從定義一個C變量開始成為一個C高手

一、基本術語

1.1 什么是對象(object)

C語言中的對象含義與C++的完全不同,C語言中的對象指的是存儲數據的一塊內存。對象可以存儲一個或多個值,一個對象可能并未存儲實際的值,但是在存儲適當的值時一定具有相應的大小。對象可以存在于程序的執(zhí)行期,也可以僅存在于它所在函數的執(zhí)行期。

1.2 什么是標識符(identifier)

標識符就是一個名稱,通過這個標識符可以修改對象的內容。標識符可以在源代碼的多文件中共享、可用于特定文件的任意函數中、可僅限于特定函數中使用,甚至只在函數中的某部分使用。

舉個例子,我們定義一個int型變量point:

int point;

對象與標識符的關系如下圖

深度解析C語言中的變量作用域、鏈接和存儲期的含義

二、作用域、鏈接和存儲期三者關系

存儲期用來描述對象,所謂的存儲期就是指對象在內存中可以保留多長時間。

標識符用于訪問對象,使用作用域(scope)和鏈接(linkage)描述標識符,標識符的作用域和鏈接表明了程序的哪些部分可以使用它。

三、作用域詳解

作用域描述程序中可訪問標識符的區(qū)域

一個C變量的作用域可以是塊作用域、函數作用域、函數原型作用域和文件作用域,下面我們詳細講解每個作用域的含義。

3.1 塊作用域

塊是用一對花括號括起來的代碼區(qū)域,定義在塊中的變量具有塊作用域塊作用域變量的可見范圍是從定義處到包含該定義的塊的末尾

另外,雖然函數的形式參數聲明在函數的左花括號之前,但它們也具有塊作用域,屬于函數體這個塊。


 
int Star_CongShanRuoShui(int user_id)
 
{
 
int res = ;
 
......
 
return
 
}

上面code中“user_id”和“res”都具有塊作用域


 
int Star_CongShanRuoShui(int user_id[] , int n)
 
{
 
int res = ;
 
for(int i=;i<n;++i)
 
{
 
......
 
int q=; //q的作用域開始
 
 
 
......
 
} //q的作用域結束
 
......
 
return
 
}

上面code中變量“q”的作用域僅限于for循環(huán)的循環(huán)體中

3.1.1 塊概念的擴展

C99將塊概念擴展到包括for循環(huán)、while循環(huán)、do while循環(huán)和if語句所控制的代碼,即使這些代碼沒有使用花括號括起來,也算是塊的一部分,下面的code


 
#include<stdio.h>
 
 
 
int main()
 
{
 
int Star_CSRS = 8;
 
printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
 
Star_CSRS ,&Star_CSRS);
 
 
 
for(int Star_CSRS=;Star_CSRS<4;++Star_CSRS)
 
{
 
printf("[for index] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
 
Star_CSRS ,&Star_CSRS);
 
 
 
int Star_CSRS = 6;
 
printf("[for] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
 
Star_CSRS ,&Star_CSRS);
 
 
 
++Star_CSRS;
 
}
 
 
 
printf("[main] value of Star_CSRS is %d | address of Star_CSRS:%p\n",
 
Star_CSRS ,&Star_CSRS);
 
 
 
return ;
 
}

輸出如下:

深度解析C語言中的變量作用域、鏈接和存儲期的含義

  • 在main中定義了變量Star_CSRS,在for循環(huán)頭中定義的變量Star_CSRS 隱藏了main中的Star_CSRS
  • for的循環(huán)體中的Star_CSRS又隱藏了for循環(huán)頭中的Star_CSRS

    深度解析C語言中的變量作用域、鏈接和存儲期的含義

3.2 函數作用域

函數作用域的概念僅限于goto語句的標簽。這意味著即使一個標簽首次出現在函數的內層塊中,它的作用域也延伸至整個函數中(C語言GOTO你不知道的事情)。

3.3 函數原型作用域

用于函數原型的形參變量名,如下所示:

int Star_CongShanRuoShui(int user_id);

函數原型作用域的范圍是從形參定義處到原型聲明結束。對于函數原型中的形參編譯器只關心形參類型,不關系具體的形參名即使有形參名也不必與函數定義中的形參名相匹配

只有在變長數組中,形參名才有意義,如下例(GCC手冊解析—變長數組):

int Star_CongShanRuoShui(int n ,int user_id[n]);

3.4 文件作用域

定義在所有函數外的變量具有文件作用域。具有文件作用域的變量,從它的定義處到該定義所在文件的末尾均可見(文件作用域變量也稱為全局變量)。

翻譯單元與文件

  • 編譯器將一個源代碼文件和所有的頭文件都看成一個包含信息的單獨文件,這個文件被稱為翻譯單元
  • 一個翻譯單元包括一個源代碼文件和它所include的文件
  • 如果一個程序有多個源代碼文件,那么這個程序也將有多個翻譯單元
  • 一個文件作用域變量的可見范圍其實是整個翻譯單元(一個源代碼文件+頭文件)

四、鏈接詳解

C變量有3中鏈接屬性:無鏈接、內部鏈接、外部鏈接

4.1 無鏈接

具有塊作用域、函數作用域和函數原型作用域的變量都是無鏈接變量。這意味著這些變量屬于定義它們的塊、函數或原型私有。

4.2 內部鏈接

內部鏈接變量只能在一個翻譯單元中使用,該變量使用存儲類別說明符static修飾,如下:


 
int Star_CSDN=1; //文件作用域,外部鏈接
 
static int Star_CongShanRuoShui=2; //文件作用域,內部鏈接
 
 
 
int main()
 
{
 
......
 
return
 
}

4.3 外部鏈接

外部鏈接變量可以在多個文件中使用。外部鏈接變量的聲明分為“定義性聲明”和“引用性聲明”。C編譯器要求一個變量只能定義一次,重復定義編譯器會報錯。如果需要在其它文件中使用外部鏈接變量需要使用extern引用性聲明這個變量,如下面cdoe:


 
//file a.c
 
 
 
//在文件a.c中定義一個外部鏈接變量Star_CongShanRuoShui
 
int Star_CongShanRuoShui = 2;
 
 
 
......

 
//file b.c
 
 
 
//文件b.c中使用extern引用性聲明變量Star_CongShanRuoShui
 
extern int Star_CongShanRuoShui;
 
 
 
......

五、存儲期詳解

C對象有4種存儲期:靜態(tài)存儲期、線程存儲期、自動存儲期、動態(tài)分配存儲期。

5.1 靜態(tài)存儲期

具有靜態(tài)存儲期的對象,它在程序的執(zhí)行期間一直存在。文件作用域變量具有靜態(tài)存儲期

注意,對于文件作用域變量,關鍵字static表明了其鏈接屬性,而非存儲期。以static聲明的文件作用域變量具有內部鏈接屬性,但是無論是內部鏈接還是外部鏈接,所有文件作用域變量都具有靜態(tài)存儲期。

5.2 線程存儲期

線程存儲期用于并發(fā)程序設計,程序執(zhí)行可被分為多個線程。具有線程存儲期的對象,從被聲明時到線程結束一直存在。以關鍵字__Thread_local聲明一個對象時,每個線程都獲得這個變量的私有備份

5.3 自動存儲期

塊作用域的變量通常都具有自動存儲期。當程序進入定義這些變量的塊時,為這些變量分配內存;當退出這個塊時,釋放剛才為這些變量分配的內存。通過這種做法可以實現內存的重復利用。

變長數組稍有例外,它的存儲期從聲明處到塊的末尾,而不是從塊的開始處到塊的末尾

我們上面說塊作用域的變量通常都具有自動存儲期,但是也能具有靜態(tài)存儲期。為了創(chuàng)建這樣的變量,要把變量聲明在塊中,且在聲明前加上關鍵字static,如下例:


 
int Star_CongShanRuoShui(int user_id)
 
{
 
static int isStar = ;
 
......
 
return
 
}

變量isStar存儲在靜態(tài)內存中,它從程序被載入到程序結束期間都存在。但是,它的作用域定義在Star_CongShanRuoShui()函數塊中,只有在執(zhí)行該函數時,程序才能使用isStar訪問它所指定的對象(當然,也可以存儲該變量的地址實現間接訪問該對象)

5.4 動態(tài)分配存儲期

程序運行時通過malloc()等內存分配函數分配的對象具有動態(tài)分配存儲期,這樣的對象需要使用free()函數進行銷毀。

動態(tài)內存分配和變長數組在功能上有些重合,但是還是有所不同:

  • 變長數組是自動存儲類型
  • 用malloc函數創(chuàng)建的數組不必局限在一個函數中使用

以上就是深度解析C語言中的變量作用域、鏈接和存儲期的含義的詳細內容,更多關于C語言變量作用域、鏈接和存儲期的資料請關注服務器之家其它相關文章!

原文鏈接:https://blog.csdn.net/qq_31985307/article/details/117388223

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監(jiān)聽多個端口

    c++ 單線程實現同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 九色激情网 | 一区二区三区在线观看国产 | 久久精品欧美一区二区三区不卡 | av在线免费电影 | 4p一女两男做爰在线观看 | 91福利影视 | 成人一区三区 | 欧美成人精品一区二区三区 | 午夜丰满少妇高清毛片1000部 | 成人免费入口 | 午夜精品小视频 | 久久91久久久久麻豆精品 | 永久免费不卡在线观看黄网站 | 一区二区免费 | 日本不卡视频在线观看 | 久久亚洲国产精品 | 国产精品99久久久久久久女警 | 毛片视 | 免费在线观看毛片视频 | 欧美成人视 | 精品一区二区在线播放 | 成人在线免费观看小视频 | 成人网视频 | 日韩精品久 | 黄色高清av| 九九爱视频 | 91av资源在线| 日韩视频在线不卡 | 欧美激情999 | 精品久久久久久久久久久下田 | 久久精品国产99国产精品亚洲 | 久久91亚洲精品久久91综合 | 在线成人精品视频 | 一级一级一级一级毛片 | 久草热久 | 激情国产视频 | 国产免费美女 | 免费看日韩片 | 久草热久 | 在线成人免费网站 | 中文字幕精品在线观看 |