深入分析C語(yǔ)言存儲(chǔ)類(lèi)型與用戶(hù)空間內(nèi)部分布
1、定義變量的格式
存儲(chǔ)類(lèi)型 數(shù)據(jù)類(lèi)型 變量名 = 初始值;
2、6個(gè)存儲(chǔ)類(lèi)型
自動(dòng)存儲(chǔ)區(qū):auto register
非自動(dòng)存儲(chǔ)區(qū):const static extern volatile
3、auto存儲(chǔ)類(lèi)型-自動(dòng)存儲(chǔ)類(lèi)型
自動(dòng)類(lèi)型:局部變量屬于自動(dòng)類(lèi)型,定義局部變量時(shí),加auto或者不加auto都是一樣的,一般省略auto.
非自動(dòng)類(lèi)型:全局變量,使用static修飾的全局變量或者局部變量不可以使用auto進(jìn)行修飾。
#include <stdio.h> int s; // 全局變量,屬于非自動(dòng)類(lèi)型,不可以使用auto修飾 // auto int k; // error static int x; // 使用static修飾的靜態(tài)全局變量,屬于非自動(dòng)類(lèi)型,不可以使用auto修飾 // auto static int x; // error int main(int argc, const char *argv[]) { /*your code*/ int i; // 自動(dòng)類(lèi)型變量,省略auto auto int j; // 自動(dòng)類(lèi)型變量,使用auto修飾 static int m; // 使用static修飾的靜態(tài)局部變量,屬于非自動(dòng)類(lèi)型,不可以使用auto修飾 // auto static int n; // error return 0; }
4、register存儲(chǔ)類(lèi)型-寄存器存儲(chǔ)類(lèi)型
定義寄存器存儲(chǔ)類(lèi)型的變量,定義的變量分配一個(gè)寄存器的空間給變量使用。
盡量不要定義寄存器類(lèi)型的變量,在CPU中寄存器的數(shù)量有限(空間有限)
寄存器變量不可以進(jìn)行去地址取運(yùn)算(&),原因是寄存器沒(méi)有地址。
5、const存儲(chǔ)類(lèi)型-常量存儲(chǔ)類(lèi)型
1.只讀,初始化后不能修改;
2.使代碼更緊湊;
3.編譯器自然保護(hù)不希望改變的參數(shù),防止無(wú)意修改代碼
(例:const int * p=&a ,表示*p不能改變a的值
? int const * p=&a ,表示*p不能改變a的值
? int * const p=&a ,表示p指向的地址不能改變
? const int * const p=&a ,表示既不能改變指向的地址,又不能改變指向地址中的值)
6、static-靜態(tài)存儲(chǔ)類(lèi)型
1.static修飾局部變量:延長(zhǎng)生命周期到整個(gè)進(jìn)程結(jié)束,
? 只在第一次調(diào)用此函數(shù)時(shí),對(duì)靜態(tài)局部變量進(jìn)行初始化,后面在此調(diào)用函數(shù),不在初始化
? 如果定義的靜態(tài)局部變量沒(méi)有進(jìn)行初始化,默認(rèn)初始化為0
2.static修飾全局變量:外部文件不可以使用,靜態(tài)全局變量的作用域在本文件內(nèi)。
3.static修飾函數(shù):外部文件不可以使用,靜態(tài)全局變量的作用域在本文件內(nèi)。
7、extern-修飾全局變量
1.externa修飾全局變量,表示這個(gè)全局變量在其他文件中定義的
2.externa修飾函數(shù),表示這個(gè)函數(shù)是在其他文件中定義的
3.聲明一個(gè)變量,extern聲明的變量沒(méi)有建立存儲(chǔ)空間。int a;//變量在定義的時(shí)候創(chuàng)建存儲(chǔ)空間
8、volatile-易變存儲(chǔ)類(lèi)型
volatile關(guān)鍵字用來(lái)阻止編譯器認(rèn)為的無(wú)法“被代碼本身”改變的代碼進(jìn)行優(yōu)化。
如在C語(yǔ)言中,volatile關(guān)鍵字可以用來(lái)提醒編譯器它后面所定義的變量隨時(shí)有可能改變,
因此編譯后的程序每次需要存儲(chǔ)或讀取這個(gè)變量的時(shí)候,都會(huì)直接從變量地址中讀取數(shù)據(jù)。
如果沒(méi)有volatile關(guān)鍵字,則編譯器可能優(yōu)化讀取和存儲(chǔ),可能暫時(shí)使用寄存器中的值,
如果這個(gè)變量由別的程序更新了的話,將出現(xiàn)不一致的現(xiàn)象。
在java并發(fā)編程中,volatile的作用
對(duì)于可見(jiàn)性,java提供了volatile關(guān)鍵字來(lái)保證可見(jiàn)性。
當(dāng)一個(gè)共享的變量被volatile修飾時(shí),它會(huì)保證修改的值會(huì)立即被更新到主存當(dāng)中,當(dāng)其他線程需要讀取時(shí),
它會(huì)去內(nèi)存中讀取新值。
9、用戶(hù)空間內(nèi)部分布圖
代碼解析:
#include <stdio.h> int d; // 全局變量未初始化 值為0 .bss int e=10; //全局變量初始化 .data char *p = "hello"; //字符指針 p在.data "hello"在.rodata char arr[] = "world"; //.字符數(shù)組 .data static int f; //使用static修飾的未初始化的全局變量 值為0 .bss static int g=20; //使用static修飾的初始化的全局變量 .data int main(int argc, const char *argv[]) { int a=10; //局部變量初始化 棧區(qū) int b; //局部變量未初始化,隨機(jī)值 棧區(qū) static int c; //使用static修飾的局部變量 未初始化 值為0 .bss static int d=20; //使用static修飾的局部變量初始化 .data char *p = "hello"; //字符指針 p:在棧區(qū) “hello”在 .rodata char arr[] = "world"; //字符數(shù)組 棧 char *q = malloc(10); //q在棧區(qū),指向堆區(qū)的10字節(jié)的?地址 return 0; }
到此這篇關(guān)于深入分析C語(yǔ)言存儲(chǔ)類(lèi)型與用戶(hù)空間內(nèi)部分布的文章就介紹到這了,更多相關(guān)C語(yǔ)言存儲(chǔ)類(lèi)型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言數(shù)據(jù)在內(nèi)存中的存儲(chǔ)流程深入分析
- C語(yǔ)言大小端字節(jié)序存儲(chǔ)模式深入解讀
- C語(yǔ)言詳細(xì)分析不同類(lèi)型數(shù)據(jù)在內(nèi)存中的存儲(chǔ)
- C語(yǔ)言中數(shù)據(jù)如何存儲(chǔ)進(jìn)內(nèi)存揭秘
- C語(yǔ)言深入分析整形數(shù)據(jù)存儲(chǔ)
- C語(yǔ)言數(shù)據(jù)存儲(chǔ)歸類(lèi)介紹
- C語(yǔ)言深入探索數(shù)據(jù)類(lèi)型的存儲(chǔ)
- C語(yǔ)言數(shù)據(jù)的存儲(chǔ)專(zhuān)項(xiàng)分析
相關(guān)文章
淺析C++中dynamic_cast和static_cast實(shí)例語(yǔ)法詳解
這篇文章主要介紹了淺析C++中dynamic_cast和static_cast實(shí)例演示,包括static_cast語(yǔ)法知識(shí)和static_cast的作用講解,namic_cast 語(yǔ)法詳解,需要的朋友可以參考下2021-07-07Windows注冊(cè)表中修改UAC(用戶(hù)賬號(hào)控制)及批處理腳本
今天小編就為大家分享一篇關(guān)于Windows注冊(cè)表中修改UAC(用戶(hù)賬號(hào)控制)及批處理腳本,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C語(yǔ)言中qsort函數(shù)的介紹與用法實(shí)例
C語(yǔ)言的標(biāo)準(zhǔn)庫(kù)提供了一個(gè)重要的排序函數(shù)qsort給C語(yǔ)言使用者使用,qsort函數(shù)將快速排序的算法封裝起來(lái),這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中qsort函數(shù)的介紹與用法的相關(guān)資料,需要的朋友可以參考下2021-09-09C++中priority_queue模擬實(shí)現(xiàn)的代碼示例
在c++語(yǔ)言中數(shù)據(jù)結(jié)構(gòu)中的堆結(jié)構(gòu)可以通過(guò)STL庫(kù)中的priority_queue 優(yōu)先隊(duì)列來(lái)實(shí)現(xiàn),這樣做極大地簡(jiǎn)化了我們的工作量,這篇文章主要給大家介紹了關(guān)于C++中priority_queue模擬實(shí)現(xiàn)的相關(guān)資料,需要的朋友可以參考下2021-08-08深入C++浮點(diǎn)數(shù)無(wú)效值定義與判定的解決辦法
本篇文章是對(duì)C++中浮點(diǎn)數(shù)無(wú)效值定義與判定進(jìn)行了介紹,需要的朋友參考下2013-05-05數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的創(chuàng)建和讀取詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03C++中 STL list詳解及簡(jiǎn)單實(shí)例
這篇文章主要介紹了C++中 STL list詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-04-04