中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c語言存儲類里的關鍵字有哪些

發布時間:2021-11-22 15:32:31 來源:億速云 閱讀:172 作者:iii 欄目:大數據

本篇內容主要講解“c語言存儲類里的關鍵字有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“c語言存儲類里的關鍵字有哪些”吧!

-auto-


(1)auto關鍵字在C語言中只有一個作用,那就是修飾局部變量。


(2)auto修飾局部變量,表示這個局部變量是自動局部變量,自動局部變量分配在棧上。(既然

在棧上,說明它如果不初始化那么值就是隨機的······)。


(3)平時定義局部變量時就是定義的auto的,只是省略了auto關鍵字而已。可見,auto的局部變量其實就是默認定義的普通的局部變量。


- static -


(1)static關鍵字在C語言中有2種用法,而且這兩種用法彼此沒有任何關聯、完全是獨立的。其實當年本應該多發明一個關鍵字,但是C語言的作者覺得關鍵字太多不好,于是給static增加了一種用法,導致static一個關鍵字竟然有兩種截然不同的含義。


(2)static的第一種用法是:用來修飾局部變量,形成靜態局部變量。要搞清楚靜態局部變量和非靜態局部變量的區別。本質區別是存儲類不同(存儲類不同就衍生出很多不同):非靜態局部變量分配在棧上,而靜態局部變量分配在數據段/bss段上, 在數據段的話,它是初始化好的,在bss段的話,一般我們沒有初始化的,一般默認0,這個和全局變量不初始化一樣。


#include <stdio.h>

int main(void)
{
    static a;

    printf("the a is %d\n",a);

    return 0;
}
 


演示結果:


    the a is 0 


(3)static的第二種用法是:用來修飾全局變量,形成靜態全局變量。要搞清楚靜態全局變量和非靜態全局變量的區別。區別是在鏈接屬性上不同,等下面有介紹的。這里的話我舉幾個例子來說明:


------沒用static關鍵字修飾:


  #include <stdio.h>

   void test()
  {
       int num = 0;
       num++;
       printf("%d ", num);
  }
   int main()
   {
       int i = 0;
      for (i = 0; i < 10; i++)
      {
        test();
      }
       return 0;
   }
    

演示結果:

1 1 1 1 1 1 1 1 1 1 


-----加了static修飾:

  #include <stdio.h>

   void test()
  {
      static int num = 0;
       num++;
       printf("%d ", num);
  }
   int main()
   {
       int i = 0;
      for (i = 0; i < 10; i++)
      {
        test();
      }
       return 0;
   }
 

演示結果:


    1 2 3 4 5 6 7 8 9 10 

(4)小結:


  • 靜態局部變量在存儲類方面和全局變量一樣


  • 靜態局部變量在生命周期方面和全局變量一樣。


  • 靜態局部變量和全局變量的區別是:作用域、連接屬性。靜態局部變量作用域是代碼塊作用域(和普通局部變量是一樣的)、鏈接屬性是無連接;全局變量作用域是文件作用域(和函數是一樣的)、鏈接屬性方面是外連接。這里先簡單說一下三種鏈接屬性:


  • (1)外鏈接的意思就是外部鏈接屬性,也就是說外鏈接可以在整個程序范圍內(言下之意就是可以跨文件)進行鏈接,譬如普通的函數和全局變量屬于外鏈接。


  • (2)內鏈接的意思就是(c文件內部)內部鏈接屬性,也就是說這家伙可以在當前c文件內部范圍內進行鏈接(言下之意就是不能在當前c文件外面的其他c文件中進行訪問、鏈接)。static修飾的函數/全局變量屬于內鏈接。


  • (3)無連接的意思就是這個符號本身不參與鏈接,它跟鏈接沒關系。所有的局部變量(auto的、static的)都是無連接的。


(5)靜態函數(就是使用這個static關鍵字修飾),想必搞stm32的讀者,都有接觸到(這里的話,我就不例子了);當你的程序中有很多源文件的時候(這在寫stm32的時候經常遇到,而且經常要養成多文件不被重復包含的寫法代碼習慣),一般在stm32里面會使用這個static關鍵字來修飾函數,所以這個函數就只能在這個文件內使用了,不能在外部再使用這個函數了(這個函數的作用域只能在當前文件內),其實和上面講全局變量和靜態全局變量的區別類似。


- register -


(1)register關鍵字不常用,也只有一個作用,那就是:register修飾的變量。編譯器會盡量將它分配在寄存器中。(平時分配的一般的變量都是在內存中的,其實讀取內存中的數據過程是這樣的:cpu+寄存器+cache+內存)。分配在寄存器中一樣的用,但是讀寫效率會高很多。所以register修飾的變量用在那種變量被反復高頻率的使用,通過改善這個變量的訪問效率可以極大的提升程序運行效率時。所以register是一種極致提升程序運行效率的手段。


(2)平時寫代碼要被定義成register這種情況很少,一般慎用。


(3)register編譯器只能承諾盡量將register修飾的變量放在寄存器中,但是不保證一定放在寄存器中。主要原因是因為寄存器數量有限,不一定有空用。

到此,相信大家對“c語言存儲類里的關鍵字有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

洱源县| 库车县| 久治县| 西安市| 罗江县| 汪清县| 攀枝花市| 安龙县| 防城港市| 罗田县| 长丰县| 宜兴市| 武威市| 荣成市| 南涧| 常州市| 凉山| 西丰县| 百色市| 张家港市| 晴隆县| 凤山市| 襄樊市| 吴堡县| 沙河市| 启东市| 阜宁县| 仁化县| 五华县| 临湘市| 英德市| 光山县| 佛山市| 甘南县| 建湖县| 乐至县| 宁明县| 闸北区| 新巴尔虎左旗| 滨海县| 印江|