您好,登錄后才能下訂單哦!
本篇內容主要講解“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語言存儲類里的關鍵字有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。