Linux C - C基礎(chǔ)篇七(初識指針)
在C語言中,所有的變量都是存放在內(nèi)存中,內(nèi)存可以理解為一組有序字節(jié)組成的數(shù)組,每個(gè)字節(jié)都有唯一的地址。CPU通過內(nèi)存尋址對存儲在內(nèi)存中的數(shù)據(jù)對象的地址進(jìn)行定位,數(shù)據(jù)對象是指存儲在內(nèi)存中的一個(gè)指定數(shù)據(jù)類型的數(shù)值或字符串,它們都有一個(gè)自己的地址,而指針便是保存這個(gè)地址的變量。也就是說:指針其實(shí)是保存另一個(gè)變量的地址,我們能夠通過這個(gè)地址從而間接地操作這個(gè)變量。每個(gè)指針都有一個(gè)對應(yīng)的數(shù)據(jù)類型,不同指針之間的區(qū)別不在指針本身,而在于指針?biāo)傅淖兞康念愋蜕稀?/p>指針的定義
我們通過在標(biāo)識符前加一個(gè)操作符 * 來定義指針變量。如下,定義一個(gè)指向int類型的指針ip,ip沒有指向任何實(shí)際的對象。
int *ip;
定義一個(gè)指針變量ip1,ip1被初始化為val的地址,通常在變量名前加上&表示取變量的地址。
int val = 100;
int *ip1 = &val;
ip和ip1都指向val,持有同樣的地址值。
ip = ip1;
指針不能指向非地址值,例如下面的賦值是錯(cuò)誤的:
ip1 = val;
指針不能被初始化或賦值為其他類型對象的地址值,例如下面的指針賦值都是錯(cuò)誤的:
double dval;
ip = &dval;
通常在指針的前面加上一個(gè)*代表取出指針指向地址里面的值:
val = *p1;
C提供了一種特殊的指針類型,空(void*)類型指針,它可以被任何數(shù)據(jù)指針類型的地址值賦值。void*表明相關(guān)的值是個(gè)地址,但該地址的對象類型不知道,我們不能夠操作空類型指針?biāo)赶虻膶ο?,只能傳送該地址值?/p>
void * vp;
vp = ip;
vp = &dval;
指針的運(yùn)算c語言中,可以對指針變量p進(jìn)行p++、p--、p + i等運(yùn)算,運(yùn)算所得結(jié)果同樣是一個(gè)指針,只不過指針?biāo)赶虻膬?nèi)存地址相比于p所指的內(nèi)存地址前進(jìn)或者后退了i個(gè)操作數(shù)。用一張圖來說明一下整型指針的操作:
p是一個(gè) int 類型的指針,指向內(nèi)存地址 0x0000001C 處,則p++將指向與p相鄰的下一個(gè)內(nèi)存地址,由于 int 型數(shù)據(jù)占 4 個(gè)字節(jié),因此 p++ 所指的內(nèi)存地址為0x0000001C+4即0x00000020,其余依次類推。不過要注意的是,這種運(yùn)算只是改變了它所指向的地址。
數(shù)組與指針在C語言中,指針與數(shù)組之間的關(guān)系非常緊密,許多可以用數(shù)組完成的工作同樣可以使用指針來完成。
先聲明一個(gè)數(shù)組:
int ia[10];
其中ia既表示數(shù)組的數(shù)組名,也代表著數(shù)組的首地址,還代表數(shù)組首元素的地址,同時(shí)我們可以用ia + i來代表數(shù)組中第i個(gè)元素的地址。那么用指針如何表示呢?
int *ip;
ip = ia;
聲明一個(gè)指向int型的指針ip,上面說了ia是個(gè)整型數(shù)組的地址,所以可以直接賦值給ip,這時(shí)ip也指向ia這個(gè)數(shù)組的首地址。ia[i] 就等效于 *(ia+i) 等效于 *(ip+i) 等效于 ip[i] 。同時(shí)我們可以用&ia[i] - &ia[j] 表示第i個(gè)元素和第j個(gè)元素這兩個(gè)地址之間相隔數(shù)據(jù)元素的個(gè)數(shù)。
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。
漏電開關(guān)相關(guān)文章:漏電開關(guān)原理 漏電保護(hù)開關(guān)相關(guān)文章:漏電保護(hù)開關(guān)原理 汽車防盜機(jī)相關(guān)文章:汽車防盜機(jī)原理