博客專欄

EEPW首頁 > 博客 > Linux C - C基礎(chǔ)篇七(初識指針)

Linux C - C基礎(chǔ)篇七(初識指針)

發(fā)布人:嵌入式Linux 時間:2023-01-12 來源:工程師 發(fā)布文章
概念

在C語言中,所有的變量都是存放在內(nèi)存中,內(nèi)存可以理解為一組有序字節(jié)組成的數(shù)組,每個字節(jié)都有唯一的地址。CPU通過內(nèi)存尋址對存儲在內(nèi)存中的數(shù)據(jù)對象的地址進行定位,數(shù)據(jù)對象是指存儲在內(nèi)存中的一個指定數(shù)據(jù)類型的數(shù)值或字符串,它們都有一個自己的地址,而指針便是保存這個地址的變量。也就是說:指針其實是保存另一個變量的地址,我們能夠通過這個地址從而間接地操作這個變量。每個指針都有一個對應(yīng)的數(shù)據(jù)類型,不同指針之間的區(qū)別不在指針本身,而在于指針?biāo)傅淖兞康念愋蜕稀?/p>指針的定義

我們通過在標(biāo)識符前加一個操作符 * 來定義指針變量。如下,定義一個指向int類型的指針ip,ip沒有指向任何實際的對象。

int *ip;

定義一個指針變量ip1,ip1被初始化為val的地址,通常在變量名前加上&表示取變量的地址。

int val = 100;

int *ip1 = &val;

ip和ip1都指向val,持有同樣的地址值。

ip = ip1;

指針不能指向非地址值,例如下面的賦值是錯誤的:

ip1 = val;

指針不能被初始化或賦值為其他類型對象的地址值,例如下面的指針賦值都是錯誤的:

double dval;

ip = &dval;

通常在指針的前面加上一個*代表取出指針指向地址里面的值:

val = *p1;

C提供了一種特殊的指針類型,空(void*)類型指針,它可以被任何數(shù)據(jù)指針類型的地址值賦值。void*表明相關(guān)的值是個地址,但該地址的對象類型不知道,我們不能夠操作空類型指針?biāo)赶虻膶ο?,只能傳送該地址值?/p>

void * vp;

vp = ip;

vp = &dval;

指針的運算

c語言中,可以對指針變量p進行p++、p--、p + i等運算,運算所得結(jié)果同樣是一個指針,只不過指針?biāo)赶虻膬?nèi)存地址相比于p所指的內(nèi)存地址前進或者后退了i個操作數(shù)。用一張圖來說明一下整型指針的操作:

p是一個 int 類型的指針,指向內(nèi)存地址 0x0000001C 處,則p++將指向與p相鄰的下一個內(nèi)存地址,由于 int 型數(shù)據(jù)占 4 個字節(jié),因此 p++ 所指的內(nèi)存地址為0x0000001C+4即0x00000020,其余依次類推。不過要注意的是,這種運算只是改變了它所指向的地址。

數(shù)組與指針

在C語言中,指針與數(shù)組之間的關(guān)系非常緊密,許多可以用數(shù)組完成的工作同樣可以使用指針來完成。

先聲明一個數(shù)組:

int ia[10];

其中ia既表示數(shù)組的數(shù)組名,也代表著數(shù)組的首地址,還代表數(shù)組首元素的地址,同時我們可以用ia + i來代表數(shù)組中第i個元素的地址。那么用指針如何表示呢?

int *ip;

ip = ia;

聲明一個指向int型的指針ip,上面說了ia是個整型數(shù)組的地址,所以可以直接賦值給ip,這時ip也指向ia這個數(shù)組的首地址。ia[i] 就等效于 *(ia+i) 等效于 *(ip+i) 等效于 ip[i] 。同時我們可以用&ia[i] - &ia[j] 表示第i個元素和第j個元素這兩個地址之間相隔數(shù)據(jù)元素的個數(shù)。


*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點,如有侵權(quán)請聯(lián)系工作人員刪除。

漏電開關(guān)相關(guān)文章:漏電開關(guān)原理
漏電保護開關(guān)相關(guān)文章:漏電保護開關(guān)原理
汽車防盜機相關(guān)文章:汽車防盜機原理


關(guān)鍵詞: 指針

相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉