- 相關(guān)推薦
c語(yǔ)言之指針基礎(chǔ)知識(shí)
將指針和普通變量進(jìn)行比較,將有助于您理解指針。所謂“普通變量”就是存儲(chǔ)器中能夠保存數(shù)值的一個(gè)位置。例如,當(dāng)您聲明變量i為一個(gè)整數(shù)時(shí),四個(gè)字節(jié)的存儲(chǔ)空間就為它預(yù)留出來(lái)了。程序中用i表示那個(gè)預(yù)留出的位置。在機(jī)器的層面上看,這個(gè)位置具有一個(gè)內(nèi)存地址。從這個(gè)地址開(kāi)始的四個(gè)字節(jié)對(duì)您(程序員)來(lái)說(shuō)就是變量i,它們可以保存一個(gè)整數(shù)。
c語(yǔ)言之指針基礎(chǔ)知識(shí)
指針就不同了。指針是指向另一個(gè)變量的變量。意思是一個(gè)指針保存的是另一個(gè)變量的內(nèi)存地址。換句話說(shuō),指針保存的并不是普通意義上的數(shù)值,而是另一個(gè)變量的地址值。一個(gè)指針保存了另一個(gè)變量的地址值,就說(shuō)這個(gè)指針“指向”了那個(gè)變量。
因?yàn)橹羔槺4媪说刂范皇菙?shù)值,所以它有兩個(gè)部分。指針本身保存一個(gè)地址,這個(gè)地址又指向一個(gè)數(shù)值,即:指針本身和被指向的數(shù)值兩部分。這個(gè)概念開(kāi)始可能有些不好理解,而一旦掌握將是極有裨益的。
下面的例子顯示了一個(gè)典型的指針:
#include
int main()
{
int i,j;
int *p;
p=&i;
*p=5;
j=i;
printf("%d %d %d ", i, j, *p);
return 0;
}
程序的第一行聲明了兩個(gè)普通的整型變量i和j。int *p這行聲明了一個(gè)名為p的指針。它告訴編譯器,所聲明的變量p是一個(gè)指向整數(shù)的指針。*表示聲明的是指針而不是普通變量。您可以創(chuàng)建任何類型的指針:float,結(jié)構(gòu)體,char等等。只要用*指出您要的是指針而非普通變量即可。
p=&i 這行您肯定還沒(méi)見(jiàn)過(guò)。C語(yǔ)言中, 這個(gè)表達(dá)式的意思就是“將i的地址賦值給p!边@條語(yǔ)句一經(jīng)執(zhí)行,p就“指向”了i。而此前p的內(nèi)容是一個(gè)未知的隨機(jī)地址,直接使用的話很可能會(huì)導(dǎo)致程序錯(cuò)誤或類似的程序崩潰。
畫(huà)圖是觀察程序運(yùn)行過(guò)程的好方法。聲明i、j和p后,程序的狀態(tài)是這個(gè)樣子:
上圖中的三個(gè)變量i、j和p都被聲明過(guò)了,但還沒(méi)有初始化。所以將兩個(gè)整型變量以含有問(wèn)號(hào)的方框表示——程序執(zhí)行到這一步時(shí)它們的內(nèi)容可以是任何值。將指針以圓圈表示,以區(qū)別于保存數(shù)值的一般變量,隨意的幾個(gè)箭頭表示它現(xiàn)在可能指向任何一個(gè)位置。
執(zhí)行了p=&i這行后,p被初始化為指向i,像這樣:
p指向i之后,i代表的內(nèi)存位置就有了兩個(gè)名字。它除了叫做i,現(xiàn)在還叫做*p。這就是為什么說(shuō)C中的指針變量有兩個(gè)部分:p是容納地址的`位置,而*p是地址指向的位置。因此*p=5的意思是將p指向的位置的值設(shè)為5,像這樣:
因?yàn)?p和i代表同一位置,i的值自然也就變成了5。于是j=i;將j也設(shè)為5,printf語(yǔ)句的輸出就是5 5 5。
指針的主要特性是它天生具有兩部分。指針本身除了保存地址,還指向某種類型的值,而這個(gè)值的地址正是指針保存的那個(gè)。在上面的例子中,指針本身是p,它指向的值是*p。
【c語(yǔ)言之指針基礎(chǔ)知識(shí)】相關(guān)文章:
C語(yǔ)言之復(fù)雜指針詳解02-01
C語(yǔ)言指針和數(shù)組基礎(chǔ)知識(shí)04-22
C語(yǔ)言的指針12-21
C語(yǔ)言指針教學(xué)02-10
C語(yǔ)言指針的用法07-02
C語(yǔ)言指針的概念02-25
C語(yǔ)言指針的總結(jié)08-12
C++ this指針詳解07-04