1.0:Hello World
2.0:整數(shù)
//C語(yǔ)言:
//16進(jìn)制 0x71ed
//8進(jìn)制:0125
//二進(jìn)制:1010101(C語(yǔ)言并沒(méi)有單獨(dú)的二進(jìn)制表示方法。前面這個(gè)數(shù)表示十進(jìn)制)
//十進(jìn)制:100
//匯編語(yǔ)言:
//16進(jìn)制:1aH
//8進(jìn)制:17O
//十進(jìn)制:12D
//二進(jìn)制:101B
//十六進(jìn)制好處滔以,可以直接觀察這個(gè)數(shù)在內(nèi)存中每個(gè)字節(jié)的內(nèi)容
//原碼捉腥,反碼,補(bǔ)碼
//負(fù)數(shù)的補(bǔ)碼:負(fù)數(shù)的絕對(duì)值的原碼取反加一
//負(fù)數(shù)的原碼:負(fù)數(shù)的補(bǔ)碼取反加一得到負(fù)數(shù)絕對(duì)值的原碼你画,高位變?yōu)?
//低位優(yōu)先:低位首先存在低地址
//高位優(yōu)先:高位首先存在高地址
都知道第一位表示的是正負(fù)符號(hào) 則:0000 0000表示的是0; 0111 1111表示的是127抵碟,這樣正數(shù)0-127就表示完了。輪到表示負(fù)數(shù)了坏匪,負(fù)數(shù)第一位為1(規(guī)定的) 則:1000 0001表示的是-11111 1111表示的是-127拟逮,這樣負(fù)數(shù)就有-1到-127發(fā)現(xiàn)負(fù)數(shù)好像還有一個(gè)1000 0000,表示0适滓?正數(shù)已經(jīng)有了敦迄,那就表示-128吧,不浪費(fèi)凭迹。你把 1000 0000補(bǔ)碼一下就是 1000 0000
原碼
原碼就是符號(hào)位加上真值的絕對(duì)值, 即用第一位表示符號(hào), 其余位表示值. 比如如果是8位二進(jìn)制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反碼的表示方法是:
正數(shù)的反碼是其本身
負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變罚屋,其余各個(gè)位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
補(bǔ)碼的表示方法是:
正數(shù)的補(bǔ)碼就是其本身
負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號(hào)位不變, 其余各位取反, 最后+1. (即在反碼的基礎(chǔ)上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補(bǔ)
[-1] = [10000001]原 = [11111110]反 = [11111111]補(bǔ)
----------------------------------
為了解決原碼做減法的問(wèn)題, 出現(xiàn)了反碼:
計(jì)算十進(jìn)制的表達(dá)式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
發(fā)現(xiàn)用反碼計(jì)算減法, 結(jié)果的真值部分是正確的. 而唯一的問(wèn)題其實(shí)就出現(xiàn)在"0"這個(gè)特殊的數(shù)值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號(hào)是沒(méi)有任何意義的. 而且會(huì)有[0000 0000]原和[1000 0000]原兩個(gè)編碼表示0.
于是補(bǔ)碼的出現(xiàn), 解決了0的符號(hào)以及兩個(gè)編碼的問(wèn)題:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]補(bǔ) + [1111 1111]補(bǔ) = [0000 0000]補(bǔ)=[0000 0000]原
這樣0用[0000 0000]表示, 而以前出現(xiàn)問(wèn)題的-0則不存在了.而且可以用[1000 0000]表示-128:
(-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]補(bǔ) + [1000 0001]補(bǔ) = [1000 0000]補(bǔ)
-1-127的結(jié)果應(yīng)該是-128, 在用補(bǔ)碼運(yùn)算的結(jié)果中, [1000 0000]補(bǔ) 就是-128. 但是注意因?yàn)閷?shí)際上是使用以前的-0的補(bǔ)碼來(lái)表示-128, 所以-128并沒(méi)有原碼和反碼表示.(對(duì)-128的補(bǔ)碼表示[1000 0000]補(bǔ)算出來(lái)的原碼是[0000 0000]原, 這是不正確的)
使用補(bǔ)碼, 不僅僅修復(fù)了0的符號(hào)以及存在兩個(gè)編碼的問(wèn)題, 而且還能夠多表示一個(gè)最低數(shù). 這就是為什么8位二進(jìn)制, 使用原碼或反碼表示的范圍為[-127, +127], 而使用補(bǔ)碼表示的范圍為[-128, 127].
因?yàn)闄C(jī)器使用補(bǔ)碼, 所以對(duì)于編程中常用到的32位int類(lèi)型, 可以表示范圍是: [-2^31, 23^1-1] 因?yàn)榈谝晃槐硎镜氖欠?hào)位.而使用補(bǔ)碼表示時(shí)又可以多保存一個(gè)最小值.
3.0:浮點(diǎn)數(shù)
3.1:浮點(diǎn)數(shù)定義和存儲(chǔ)
C語(yǔ)言中浮點(diǎn)數(shù)的定義:
1. 單精度浮點(diǎn)數(shù):float,4個(gè)字節(jié)
2. 雙精度浮點(diǎn)數(shù):double嗅绸,8個(gè)字節(jié)
float x = 1.723f;//加入f代表單精度浮點(diǎn)數(shù)
浮點(diǎn)數(shù)是將特定長(zhǎng)度的連續(xù)字節(jié)(4個(gè)字節(jié)和8個(gè)字節(jié))的所有二進(jìn)制位(32位和64位)分割為特定寬度的三個(gè)域:
- 符號(hào)域:S脾猛,占1位,正數(shù)為0鱼鸠,負(fù)數(shù)為1
- 階碼域:E猛拴,占8位或者11位羹铅,E=e+127(float) or e+1023(double),指數(shù)e 有正負(fù)既有符號(hào)數(shù)愉昆,但階碼為正即無(wú)符號(hào)數(shù)职员,所以將e加上127或者1023作為偏移,方便指數(shù)的比較跛溉。
- 尾數(shù)域:M焊切,占23位或者52位
- 計(jì)算浮點(diǎn)數(shù)的存儲(chǔ)方式,只需要依次求出1位符號(hào)位芳室,8位或11位的階碼哟绊,以及23位或者52位的尾數(shù)即可俯艰。
- 公式:V=(-1)^s *M *2e=(-1)s *M *2^(E-127)/(E-1023)
浮點(diǎn)數(shù)在X86系統(tǒng)以低位優(yōu)先方式處處
4.0:數(shù)據(jù)類(lèi)型
C語(yǔ)言是一個(gè)強(qiáng)類(lèi)型語(yǔ)言,數(shù)據(jù)必須明確指定類(lèi)型碴卧。
4.1:內(nèi)建型別
- 字符類(lèi)型:char(ASCII編碼深夯,1)/wchar_t(Unicode編碼抖格,與平臺(tái)有關(guān),windows平臺(tái)2個(gè)字節(jié)咕晋,unix平臺(tái)4個(gè)字節(jié))
- 整型:short(2)/int(4)/long(與平臺(tái)有關(guān)雹拄,windows平臺(tái)4個(gè)字節(jié),unix平臺(tái)32位4個(gè)字節(jié)掌呜,64位8個(gè))/long long(Linux中用的多滓玖,C語(yǔ)言標(biāo)準(zhǔn)沒(méi)有此類(lèi)型,是linux中的一個(gè)擴(kuò)展)/_int64(C語(yǔ)言標(biāo)準(zhǔn)沒(méi)有此類(lèi)型质蕉,Windows中的一個(gè)擴(kuò)展)
- 實(shí)數(shù)單精度:float(4)
- 實(shí)數(shù)雙精度:double(8)
- 有符號(hào)和無(wú)符號(hào):signed/unsigned,(signed)int/unsigned int
- 布爾類(lèi)型:bool势篡,0/1(true/false)C99<stdbool.h>;在之前的C99中沒(méi)有bool類(lèi)型需要自己定義
typedef int bool;
#define true 1
#define false 0
char gender = 'M';//ASCII字符
wchar_t sex = L'F'//加L表示UNICODE字符,Windows平臺(tái)使用的Unicode32位編碼模暗,占用2個(gè)字節(jié)禁悠;Linux平臺(tái)使用的Unicode64編碼,占用4個(gè)字節(jié)
char name[16]="tom";
wchar_t nick[16]=L"Jack";//加L表示UNICODE字符兑宇,Windows平臺(tái)使用的Unicode32位編碼碍侦,每個(gè)字符占用2個(gè)字節(jié);Linux平臺(tái)使用的Unicode64編碼隶糕,每個(gè)字符占用4個(gè)字節(jié)
sizeof(char) = 1;
sizeof(wchar_t) = 2或者4;//認(rèn)清字符數(shù)與字節(jié)數(shù)的區(qū)別
char c = 'a';//'a'是字符常量瓷产,c是字符常量。常量是用單引號(hào)包圍枚驻。
wchar_t wc = L'a';
short a1 = 100;
int a2 = 0x64;
long a3 = 100L;
unsigned short a4 = 100;
unsigned int a5 = 100;
unsigned long a6 = 100UL;
long long a7 = 100LL;//Linux
_int64 a8 = 100i64;//Windows
unsigned char/signed char濒旦,只寫(xiě)char,由編譯器決定是有符號(hào)無(wú)符號(hào)
內(nèi)建型別:數(shù)據(jù)以字節(jié)為單位存儲(chǔ)在內(nèi)存中
大寫(xiě)A的ASCII值為65测秸,小寫(xiě)a的ASCII值為97疤估,相差32灾常。在程序中是個(gè)硬編碼,不要使用铃拇,用'a'-'A'替代
Unicode4編碼具體實(shí)現(xiàn)有Utf-8(字符占用的字節(jié)可以從1到4個(gè))钞瀑,Utf-16(2),Uft-32(4)慷荔;
網(wǎng)頁(yè)通常采用Utf-8編碼雕什,可以加快瀏覽速度。
C語(yǔ)言中的類(lèi)型显晶,可以通過(guò)typedef定義成新的類(lèi)型贷岸。比如下面的例子:
typedef int INT
typedef unsigned int UINT
typedef unsigned short USHORT
typedef char CHAR
typedef unsigned long ULONG
typedef usigned short WORD
typedef unsigned int DWORD
typedef char CHAR
4.2:類(lèi)型長(zhǎng)度與取值范圍
sizeof計(jì)算類(lèi)型或者變量的長(zhǎng)度,字節(jié)為單位磷雇,是操作符偿警,不是函數(shù)。在編譯階段確定唯笙,而不是運(yùn)行階段螟蒸。
注意
sizeof(char)的長(zhǎng)度為:1
sizeof(wchar_t):2或4
sizeof(short)的長(zhǎng)度為:2
sizeof(int)的長(zhǎng)度為:4
sizeof(long)的長(zhǎng)度為:4(Win X86和X64都為4,Linux X86為4,X64為8)
sizeof(float)的長(zhǎng)度為:4
sizeof(double)的長(zhǎng)度為:8
sizeof(bool)的長(zhǎng)度為:1(C++里)
sizeof(BOOL)的長(zhǎng)度為:4(windows平臺(tái))
類(lèi)型 | 有符號(hào) | 無(wú)符號(hào) |
---|---|---|
char | [-128, 127] | [0, 255] |
short | [-32768, 32767] | [0, 65535] |
int/long | [-2147483648, 2147483647] | [0, 4294967295] |
float | [-3.4*10^38, 3.4*10^38] | |
double | [-1.7*10^308, 1.7*10^308] |
有符號(hào)最小值:除了1之外崩掘,其他位都為0
整數(shù)溢出之后發(fā)生什么呢七嫌? (char)(-128*-1)
整數(shù)上溢出1:最小值;下溢出1:最大值
以一個(gè)字節(jié)為例子:
有符號(hào):[-128, 127]; 127+1->-128; -128-1->127
無(wú)符號(hào):[0, 255]; 255+1->0; 0-1->255
4.3:類(lèi)型轉(zhuǎn)換
- 類(lèi)型轉(zhuǎn)換:將一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型苞慢,一種類(lèi)型指針轉(zhuǎn)為另一種類(lèi)型指針诵原。
- 強(qiáng)制轉(zhuǎn)換:(新類(lèi)型)變量
char c =‘a(chǎn)’;
short i = (short)c;
int a = (int)i;
long b = (long)a;
float c = (float)b;
double d = (double)c;
上面的轉(zhuǎn)換都是從寬度短的轉(zhuǎn)換為寬度大的。當(dāng)把一個(gè)寬度短的數(shù)據(jù)類(lèi)型到寬度大的數(shù)據(jù)類(lèi)型轉(zhuǎn)換的時(shí)候挽放,是用符號(hào)位填充多出的位數(shù)绍赛。
類(lèi)型 | 原1字節(jié)數(shù) | 轉(zhuǎn)換為2字節(jié)數(shù) |
---|---|---|
正數(shù) | 00110101 | 00000000 00110101 |
負(fù)數(shù) | 10110100 | 11111111 10110100 |
下面的例子是把寬度長(zhǎng)的轉(zhuǎn)換為寬度短的,這個(gè)過(guò)程可能會(huì)造成數(shù)據(jù)的丟失:
int x = 0x12345678;
short y = (short)x;
當(dāng)把占4個(gè)字節(jié)的x強(qiáng)轉(zhuǎn)為占2個(gè)字節(jié)的y的時(shí)候骂维,整數(shù)的高位2個(gè)字節(jié)將會(huì)被截?cái)嘁虼巳亲剩瑈只保留了0x12345678中的低位2個(gè)字節(jié)0x5678。
浮點(diǎn)數(shù)到整數(shù)
int i = (int)3.15;//不是四舍五入航闺,取整
如果一個(gè)運(yùn)算符兩邊的運(yùn)算數(shù)類(lèi)型不同褪测,先要將其轉(zhuǎn)換為相同的類(lèi)型,即較低類(lèi)型轉(zhuǎn)換為較高類(lèi)型潦刃,然后再參加運(yùn)算侮措,轉(zhuǎn)換規(guī)則如圖所示。
5:變量
常量乖杠,顧名思義分扎,就是其值不會(huì)改變的數(shù)據(jù),就是不同數(shù)據(jù)類(lèi)型中不變的值胧洒。
變量畏吓,內(nèi)存或寄存器中用一個(gè)標(biāo)識(shí)符命名的存儲(chǔ)單元墨状,可以用來(lái)存儲(chǔ)一個(gè)特定類(lèi)型的數(shù)據(jù),并且數(shù)據(jù)的值在程序運(yùn)行過(guò)程中可以進(jìn)行修改菲饼。
5.1:變量定義與命名
程序員一旦定義了變量肾砂,那么,變量就至少可為我們提供兩個(gè)信息:一是變量的地址宏悦,即就是镐确,操作系統(tǒng)為變量在內(nèi)存中分配的若干內(nèi)存的首地址;二是變量的值饼煞,也就是源葫,變量在內(nèi)存中所分配的那些內(nèi)存單元中所存放的數(shù)據(jù)。
int a = 10;
a=100;
printf(“addr:%p,value:%d\n”, &a,a);
由于程序的多樣需要砖瞧,我們對(duì)變量也有各種各樣的要求息堂,比如:
- 變量的生命期
- 變量的初始狀態(tài)
- 變量的有效區(qū)域
- 變量的開(kāi)辟地
- 變量的開(kāi)辟區(qū)域的大小
C語(yǔ)言設(shè)置了以下變量:
- 不同數(shù)據(jù)類(lèi)型的變量;如:char cHar, int iTimes, float faverage;
- 全局變量块促;
- 局部變量储矩;
- 靜態(tài)變量:靜態(tài)全局變量和靜態(tài)局部變量;關(guān)鍵詞:static
- 寄存器變量:關(guān)鍵詞:register;
- 外部變量:關(guān)鍵詞:extern;
在函數(shù)內(nèi)部說(shuō)明的變量為局部變量褂乍,只有在函數(shù)執(zhí)行時(shí),局部變量才存在即硼,當(dāng)函數(shù)執(zhí)行完退出后逃片,局部變量隨之消失。也就是只酥,當(dāng)函數(shù)執(zhí)行完退出后褥实,原先在函數(shù)內(nèi)定義的變量現(xiàn)在不能用。
與局部變量不同裂允,全局變量在整個(gè)程序都是可見(jiàn)的损离,可在整個(gè)程序運(yùn)行過(guò)程中,對(duì)于任何一個(gè)程序都是可用的绝编。全局變量的說(shuō)明的位置在所有函數(shù)之外僻澎,但可被任何一個(gè)函數(shù)使用,讀取或者寫(xiě)入十饥。
靜態(tài)變量是分配在存儲(chǔ)器中C程序所占據(jù)的數(shù)據(jù)段內(nèi)窟勃,C程序運(yùn)行的整個(gè)過(guò)程中一直保留,不會(huì)被別的變量占用逗堵。靜態(tài)變量可以定義成全局變量或局部變量秉氧,當(dāng)定義為全局變量時(shí),在它定義的程序的整個(gè)運(yùn)行期間均存在并且保持原來(lái)的存儲(chǔ)單元位置不會(huì)改變蜒秤。
同靜態(tài)全局變量定義一樣汁咏,當(dāng)在局部變量名前加靜態(tài)變量說(shuō)明符static,該變量就定義為靜態(tài)局部變量亚斋。編譯器為該變量建立永久存儲(chǔ)單元。永久是指C程序運(yùn)行的整個(gè)過(guò)程中一直保留攘滩,不會(huì)被別的變量占用帅刊。靜態(tài)局部變量和靜態(tài)全局變量的根本區(qū)別在作用區(qū)域上,靜態(tài)局部變量只在它被說(shuō)明的函數(shù)或復(fù)合語(yǔ)句中有效轰驳,并且在兩次函數(shù)調(diào)用期間仍然保存其值不變厚掷,即就是有記憶功能;它們的生命期是相同的级解,和C程序整個(gè)運(yùn)行期同在冒黑。
5.2:變量作用域存儲(chǔ)空間生命周期
變量的作用域:變量能夠在什么地方被訪問(wèn)。
變量的存儲(chǔ)空間:存放變量的內(nèi)存位置勤哗。要明白變量在內(nèi)存中存放的位置抡爹,首先就先了解下系統(tǒng)的內(nèi)存布局。
PAE:physical address extension物理地址擴(kuò)展芒划。
以x86為例冬竟,x86支持32位尋址,因此可以支持最大232=4GB的虛擬內(nèi)存空間(也可以通過(guò)PAE技術(shù)增加到36位尋址民逼,因此可以將尋址空間擴(kuò)大到64GB)泵殴。如圖所示,在4G的虛擬地址空間中拼苍,Windows系統(tǒng)的內(nèi)存主要分為內(nèi)核空間和應(yīng)用層空間上下兩部分笑诅,每部分各占約2GB,其中還包括了一個(gè)64KB的NULL空間以及非法區(qū)域疮鲫。Windows內(nèi)存的邏輯地址包含2部分吆你,即段選擇符和偏移地址,CPU在做地址翻譯的時(shí)候俊犯,通過(guò)分段機(jī)制計(jì)算出一個(gè)線性地址妇多,再通過(guò)頁(yè)表機(jī)制映射到物理地址以便存取物理內(nèi)存中的數(shù)據(jù)和指令。
X64(AMD64)的內(nèi)存布局與X86的內(nèi)存布局類(lèi)似燕侠,不同的地方在于各自空間的范圍和大小不同者祖,同時(shí)X64下還存在著一些空洞(hole),如圖所示绢彤。在X64內(nèi)存理論上支持最大264的尋址空間咸包,但實(shí)際上這個(gè)空間太大了,目前根本用不完杖虾,因此實(shí)際上的X64系統(tǒng)一般都只支持到40多位(比如Windows支持44位最大尋址空間為16TB烂瘫,Linux 支持48位最大尋址空間256TB等),支持的空間達(dá)到了TB級(jí)別。但是坟比,無(wú)論是在內(nèi)核空間還是在應(yīng)用層空間芦鳍,這些上TB的空間并不都是可用的,存在著所謂的空洞葛账。
系統(tǒng)內(nèi)存布局
一個(gè)進(jìn)程的內(nèi)存空間布局
棧的大心啤?
Windows應(yīng)用棧默認(rèn)1M籍琳,可以用編譯指令/stack可以改設(shè)其他值菲宴;
Windows內(nèi)核棧,系統(tǒng)根據(jù)CPU架構(gòu)而定趋急,X86系統(tǒng)上為12KB喝峦,X64系統(tǒng)為24KB,安騰系統(tǒng)為32KB
Linux內(nèi)核棧為4K或8K呜达;應(yīng)用層10M
當(dāng)程序加載入內(nèi)存后谣蠢,程序在內(nèi)存中可以分為若干個(gè)區(qū),這些區(qū)包括:靜態(tài)區(qū)(.data,.rdata,.bss段等)查近,代碼區(qū)(.text)眉踱,堆區(qū),棧區(qū)等霜威。
內(nèi)存區(qū) | 名字 | 用途 |
---|---|---|
.text | 代碼段 | 這個(gè)存放代碼的谈喳,用匯編角度來(lái)看就是指令。 |
.rdata | 只讀數(shù)據(jù)段 | 存放常量戈泼,字符常量叁执,const常量。(read不可修改) |
.data | 數(shù)據(jù)段 | 存放已經(jīng)初始化好的全局變量和靜態(tài)變量矮冬。 |
.bss | 存放未初始化的全局變量和靜態(tài)變量。 | |
.stack | 棧區(qū) | 存放局部變量等次哈。棧區(qū)存放著函數(shù)調(diào)用過(guò)程中的形參胎署,返回地址以及局部變量等。 |
.rdata窑滞,.data琼牧,.bss都是存放的數(shù)據(jù)。除了.bss段哀卫,.rdata巨坊,.data段的值都是在編譯的時(shí)候就確定了,并且將其編譯進(jìn)了可執(zhí)行文件此改,經(jīng)過(guò)反匯編都能找得到趾撵。bss段是在代碼運(yùn)行的時(shí)候手動(dòng)編寫(xiě)匯編代碼將其初始化為0的(這就是未初始化的全局和靜態(tài)變量默認(rèn)值為0的根源)
變量的生命周期變量有效的時(shí)間段,只有在變量的生命周期內(nèi),才能訪問(wèn)該變量占调。有的變量的生命周期是函數(shù)運(yùn)行期間暂题,函數(shù)結(jié)束,變量就消失了究珊。有的變量的生命周期是程序運(yùn)行期間薪者,只要程序還未結(jié)束,變量就不會(huì)消失或銷(xiāo)毀剿涮。
變量分類(lèi):全局變量言津,局部變量,靜態(tài)變量(靜態(tài)全局變量和靜態(tài)局部變量)取试,寄存器變量悬槽,外部變量。
變量 | 作用域 | 存儲(chǔ)空間 | 生命周期 |
---|---|---|---|
全局變量 | 靜態(tài)區(qū)(.data存放初始化全局變量想括,.bss存放未初始化全局變量) | 整個(gè)程序 | 程序運(yùn)行期間 |
全局靜態(tài)變量 | 靜態(tài)區(qū)(.data存放初始化全局變量陷谱,.bss存放未初始化全局變量) | 當(dāng)前源文件 | 運(yùn)行期間 |
局部變量 | 棧 | 當(dāng)前函數(shù)內(nèi)部 | 函數(shù)執(zhí)行期間 |
局部靜態(tài)變量 | 靜態(tài)區(qū) | 當(dāng)前函數(shù)內(nèi)部,只初始化一次 | 程序運(yùn)行期間 |
寄存器變量 | 寄存器 | 當(dāng)前函數(shù) | 函數(shù)運(yùn)行期間 |
寄存器變量:不像其他變量那樣在內(nèi)存中存放數(shù)據(jù)瑟蜈,而是在CPU的寄存器中暫存數(shù)據(jù)烟逊,使用寄存器變量比使用內(nèi)存變量的操作速度快得多。只有整型和字符型變量可定義為寄存器變量铺根。由于CPU中寄存器有限宪躯,盡量減少使用數(shù)量和和占用時(shí)間,用完馬上釋放位迂;不能定義為全局變量访雪,也不能定義在結(jié)構(gòu)或者類(lèi)中。
extern關(guān)鍵字:為了解決全局變量和函數(shù)的共用問(wèn)題掂林,就引入了 extern關(guān)鍵字臣缀。這樣只需在一個(gè)文件中定義全局變量和函數(shù),在另一個(gè)文件中要用到這些變量和函數(shù)時(shí)泻帮,只需將那個(gè)文件中的變量和函數(shù)說(shuō)明表復(fù)制過(guò)來(lái)精置,在前面加上extern,告訴編譯器锣杂,這些變量和函數(shù)已經(jīng)在別的文件中定義說(shuō)明脂倦。
//main.cpp
int a = 0; //全局變量; .data
char *p1; //全局變量; .bss
static int x=10; //全局靜態(tài)變量,10為常量; .data
void func(void) {
int b; //局部變量; .stack
char s[] = “123”; //s為局部變量, .stack ; ”123”為常量, .rdata
char *p2; //p2為局部變量; .stack
char *p3 = “hello, world”; //p3為局部變量元莫,.stack ; ”hello, world”為常量, .rdata
static int c = 0;//局部靜態(tài)變量; .data
register int i =0;//寄存器變量;
p1 = (char *)malloc(128); //p1指向堆上的內(nèi)存赖阻,直到free
p2 = (char *)malloc(256);//p2指向堆上的內(nèi)存,直到free
free(p1);
free(p2);
}
int main(void) {
func();
printf(“hello world\n”);
return 0;
}
6:輸入輸出-stdio
scanf/printf