溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

c語言存儲(chǔ)類里的關(guān)鍵字有哪些

發(fā)布時(shí)間:2021-11-22 15:32:31 來源:億速云 閱讀:167 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“c語言存儲(chǔ)類里的關(guān)鍵字有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“c語言存儲(chǔ)類里的關(guān)鍵字有哪些”吧!

-auto-


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


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

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


(3)平時(shí)定義局部變量時(shí)就是定義的auto的,只是省略了auto關(guān)鍵字而已??梢?,auto的局部變量其實(shí)就是默認(rèn)定義的普通的局部變量。


- static -


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


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


#include <stdio.h>

int main(void)
{
    static a;

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

    return 0;
}
 


演示結(jié)果:


    the a is 0 


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


------沒用static關(guān)鍵字修飾:


  #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;
   }
    

演示結(jié)果:

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;
   }
 

演示結(jié)果:


    1 2 3 4 5 6 7 8 9 10 

(4)小結(jié):


  • 靜態(tài)局部變量在存儲(chǔ)類方面和全局變量一樣。


  • 靜態(tài)局部變量在生命周期方面和全局變量一樣。


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


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


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


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


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


- register -


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


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


(3)register編譯器只能承諾盡量將register修飾的變量放在寄存器中,但是不保證一定放在寄存器中。主要原因是因?yàn)榧拇嫫鲾?shù)量有限,不一定有空用。

到此,相信大家對(duì)“c語言存儲(chǔ)類里的關(guān)鍵字有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI