最基本單位 轉換關係
1Byte = 8 Bit
1 KB = 1,024 Bytes
1 MB = 1,024 KB
1 GB = 1,024 MB
1 TB = 1,024 GB
1 PB = 1,024 TB
1 EB = 1,024 PB
1 ZB = 1,024 EB
1 YB = 1,024 ZB
PS:B即Byte,音譯拜特,位元組的意思,一般以位元組作為電腦儲存容量基本單位。1個位元組是8個二進位位(8個二進位位組成1個位元組),即1Byte=8bit(八個位的組合,共有256種電路狀態)。1個數字=1個英文字母(字元)=1位元組(Byte),即一個標準英文字母就是一個位元組,它有8個位元(bit),(如A為10D,用00001010來表示,8個二進位位)。1個漢字=2個位元組,即一個標準漢字有2個位元組,8個bit一個位元組,也就是說在電腦裡1個漢字要用16個bit來表示。另外中文標點符號佔2個位元組,英文標點符號(,.?!%&+-*/),佔1個位元組,中文省略符號(……)和括(破折)號(——)各佔4個位元組。
C語言中基本類型:
32位編譯器
char :1個位元組
char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)
short int : 2個位元組
int: 4個位元組
unsigned int : 4個位元組
float: 4個位元組
double: 8個位元組
long: 4個位元組
long long: 8個位元組
unsigned long: 4個位元組
64位編譯器
char :1個位元組
char*(即指標變數): 8個位元組
short int : 2個位元組
int: 4個位元組
unsigned int : 4個位元組
float: 4個位元組
double: 8個位元組
long: 8個位元組
long long: 8個位元組
unsigned long: 8個位元組
指標變數運算總結:
對指標變數的引用包含兩個方面:一是對指標變數本身的引用,如對指標變數進行的各種運算;二是利用指標來訪問所指向變數,對指標的間接引用。
1.指標的賦值運算
(1)將變數地址值賦給指標變數,使指標指向該變數。
設有如下定義:
int a,b,*pa,*pb;float *pf;
第一行定義了整型變數a,b及指標變數pa,pb。pa、pb還沒有被賦值,因此pa、pb沒有指向任何變數,6.3(a)。下面的語句:
a=12;b=18;pa=&a;pb=&b;
第一行對a、b變數賦值,第二、三行分別將變數a、b的地址分別賦給指標變數pa、pb,使pa、pb分別指向了變數a與b。這樣,變數a也可以表示為*pa,變數b亦可以表示為*pb。6.3(b)所示。
(a) (b) (c)
圖6.3指標地址賦值
(2)相同類型的指標變數間的賦值
pa與pb都是整型指標變數,它們間可以相互賦值,如:pb=pa;是合法的,此時pa,pb都指向變數a,a、*pa、*pb是等價的。6.3(c)所示。
注意:只有相同類型的指標變數才能相互賦值,如pf=pa;是不允許的。因為pa是整型指標,pf是浮點型指標。
(3)給指標變數賦“空”值
當指標變數剛定義時,它的值是不確定的,因而指向一個不確定的單元,若這時引用指標變數,可能產生不可預料的後果,破壞程式或資料。為了避免這些問題的產生,除了上面介紹的給指標變數賦以確定的地址值之外,亦可以給指標變數賦“空”值,說明該指標不指向任何變數。
“空”指標值用NULL表示,NULL是在標頭檔stdio.h中預定義的常量,其值為0,在使用時應加上預定義行,如:
#include "stdio.h"pa=NULL;
亦可以用下面的語句給指標賦“空值”
pa=0;
或
pa='\0';
這裡指標pa並非指向0地址單元,而是具有一個確定的“空值”,表示pa不指向任何變數。
注意:指標雖然可以賦值0,但卻不能把其他的常量地址賦給指標。例如,即使你知道整型變數a的地址是4000,也不能使用下面的指派陳述式:
pa=4000;而只能:pa=&a;
對全域指標變數與局部靜態指標變數而言,在定義時若未被初始化,則編譯系統自動初始化為空白指標0。局部指標變數不會被自動初始化,因而指向不明確。
例6.1從鍵盤上輸入兩個整數到a、b,按由大到小輸出。
#include <stdio.h>void main( ){ int a,b,*pa=&a,*pb=&b,*p; /*定義pa、pb,並初始化,6.4(a)所示*/ scanf("%d%d",&a,&b); if(*pa<*pb) { p=pa; /*進行指標交換,6.4(b),(c)所示*/ pa=pb; pb=p; } printf("\n a=%d,b=%d\n",a,b); printf("\n max=%d,min=%d",*pa,*pb); /*pa指向大數,pb指向小數*/}
若輸入:12 22
輸出結果:a=12,b=22
max=22,min=12
例中一開始指標變數pa與pb被初始化,分別指向變數a與b,輸出時約定pa指向大數,pb指向小數。比較a、b的大小,a小時則交換指標pa、pb,使pa指向大數b,pb指向小數a,從而達到題中要求。指標變化情況6.4所示。
(a) (b) (c)
圖6.4指標的變化情況
2.指標的算術運算
一個指標可以加、減一個整數n,但其結果不是指標值直接加或減n,而是與指標所指對象的資料類型有關。指標變數的值(地址)應增加或減少“n×sizeof(指標類型)”。
例如,有下列定義:
int *p,a=2,b=4,c=6;
假設a,b,c三個變數被分配在一個連續的記憶體區,a的起始地址為4000;6.5(a)所示。
(a) (b) (c)
圖6.5 指標移動
語句p=&a;表示p指向a變數,即p的內容是4000;6.5(b)。
語句p=p+2;表示指標向下移兩個整型變數的位置,p的值為4000+2×sizeof(int)=4000+2×2=4004,而不是4002,因為整型變數佔兩個位元組,6.5(c)所示。
我們可以直觀的理解為:
p=p+n表示p向高地址方向移動n個儲存單元塊(一個單元塊是指指標所指變數所佔儲存空間)。
p=p-n表示p向低地址方向移動n個儲存單元塊。
p++,++p,是把當前指標p向高地址移動一個儲存單元。
若p++作為運算元,則先引用p,再將p向高地址方向移動一個儲存單元塊,而++p是先移動指標後再引用p。
p--,--p,當前指標p向低地址移動一個儲存單元塊。
若p--作為運算元,則先引用p,再將p向低地址移動一個儲存單元。而--p是先移動指標後再引用p。
3.指標的關係運算
指標可以進行關係運算。在關聯運算式中允許對兩個指標進行所有的關係運算。若p,q是兩個同類型的指標變數,則:p>q,p<q,p==q,p!=q,p>=q都是允許的。
假設p、q是指向同一數組的兩個指標,執行p>q的運算,其含義為,若運算式結果為真(非0值),則說明p所指元素在q所指元素之後。或者說q所指元素離數組第一個元素更近些。
注意:在指標進行關係運算之前,指標必須指向確定的變數或儲存地區,即指標有初始值;另外,只有相同類型的指標才能進行比較。