C語(yǔ)言01- 整數(shù)蛔六、浮點(diǎn)、數(shù)據(jù)類(lèi)型废亭、變量国章、stdio

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è)域:

  1. 符號(hào)域:S脾猛,占1位,正數(shù)為0鱼鸠,負(fù)數(shù)為1
  2. 階碼域: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ù)的比較跛溉。
  3. 尾數(shù)域:M焊切,占23位或者52位
  4. 計(jì)算浮點(diǎn)數(shù)的存儲(chǔ)方式,只需要依次求出1位符號(hào)位芳室,8位或11位的階碼哟绊,以及23位或者52位的尾數(shù)即可俯艰。
  5. 公式:V=(-1)^s *M *2e=(-1)s *M *2^(E-127)/(E-1023)

浮點(diǎn)數(shù)在X86系統(tǒng)以低位優(yōu)先方式處處

image.png

4.0:數(shù)據(jù)類(lèi)型

C語(yǔ)言是一個(gè)強(qiáng)類(lèi)型語(yǔ)言,數(shù)據(jù)必須明確指定類(lèi)型碴卧。

4.1:內(nèi)建型別

  1. 字符類(lèi)型:char(ASCII編碼深夯,1)/wchar_t(Unicode編碼抖格,與平臺(tái)有關(guān),windows平臺(tái)2個(gè)字節(jié)咕晋,unix平臺(tái)4個(gè)字節(jié))
  2. 整型: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ò)展)
  3. 實(shí)數(shù)單精度:float(4)
  4. 實(shí)數(shù)雙精度:double(8)
  5. 有符號(hào)和無(wú)符號(hào):signed/unsigned,(signed)int/unsigned int
  6. 布爾類(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'替代
image

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)換

  1. 類(lèi)型轉(zhuǎn)換:將一種類(lèi)型轉(zhuǎn)換為另一種類(lèi)型苞慢,一種類(lèi)型指針轉(zhuǎn)為另一種類(lèi)型指針诵原。
  2. 強(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ī)則如圖所示。

image

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ì)變量也有各種各樣的要求息堂,比如:

  1. 變量的生命期
  2. 變量的初始狀態(tài)
  3. 變量的有效區(qū)域
  4. 變量的開(kāi)辟地
  5. 變量的開(kāi)辟區(qū)域的大小

C語(yǔ)言設(shè)置了以下變量:

  1. 不同數(shù)據(jù)類(lèi)型的變量;如:char cHar, int iTimes, float faverage;
  2. 全局變量块促;
  3. 局部變量储矩;
  4. 靜態(tài)變量:靜態(tài)全局變量和靜態(tài)局部變量;關(guān)鍵詞:static
  5. 寄存器變量:關(guān)鍵詞:register;
  6. 外部變量:關(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)存布局


image

一個(gè)進(jìn)程的內(nèi)存空間布局

image

棧的大心啤?

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


image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末踱蠢,一起剝皮案震驚了整個(gè)濱河市火欧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖布隔,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件离陶,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衅檀,警方通過(guò)查閱死者的電腦和手機(jī)招刨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哀军,“玉大人沉眶,你說(shuō)我怎么就攤上這事∩际剩” “怎么了谎倔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猿推。 經(jīng)常有香客問(wèn)我片习,道長(zhǎng),這世上最難降的妖魔是什么蹬叭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任藕咏,我火速辦了婚禮,結(jié)果婚禮上秽五,老公的妹妹穿的比我還像新娘孽查。我一直安慰自己,他們只是感情好坦喘,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布盲再。 她就那樣靜靜地躺著,像睡著了一般瓣铣。 火紅的嫁衣襯著肌膚如雪答朋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天棠笑,我揣著相機(jī)與錄音梦碗,去河邊找鬼。 笑死腐晾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的丐一。 我是一名探鬼主播藻糖,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼库车!你這毒婦竟也來(lái)了巨柒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎洋满,沒(méi)想到半個(gè)月后晶乔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡牺勾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年正罢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驻民。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翻具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回还,到底是詐尸還是另有隱情裆泳,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布柠硕,位于F島的核電站工禾,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝗柔。R本人自食惡果不足惜闻葵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诫咱。 院中可真熱鬧笙隙,春花似錦、人聲如沸坎缭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掏呼。三九已至坏快,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間憎夷,已是汗流浹背莽鸿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾给,地道東北人祥得。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒋得,于是被迫代替她去往敵國(guó)和親级及。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359