計算機為儲存空間中的每乙個字元(8bits)分配乙個編號,通常叫做編址,這個編號就是我們常說的記憶體位址(簡稱位址),編址時保證每乙個位址都是獨一無二的且對應各自的位元組。變數所佔的那塊記憶體的起始位址來表示該變數在記憶體中的位址。編譯環境和作業系統都可能影響到顯示的位址值,因為位址是系統自動分配的。
指標變數是用於儲存位址值的變數。
語法
基型別識別符號 *指標變數名1[,指標變數名2······];
注意指標變數中儲存的位址值所對應的記憶體空間中的資料型別只能是定義時的基型別。否則雖然編譯器未必報錯,但通過指標間接訪問值時會出錯。
指標變數和普通變數一樣,定義後的指標變數儲存的是隨機值,所指向的記憶體空間未必是允許程式正常訪問的記憶體空間。
指標的賦值有下下幾種方式
int x=10;
int*p=
&x;
int x=10;
int*p;
p=&x;
間接訪問運算子「*」的運算物件只能是指標int a=10;
int*p,
*q;q=
&a;p=q;
是用指標變數的過程中需要始終關注該指標變數的指向,避免出現非法使用指標的情況。
以下是常見的錯誤
原因是p的指向不明,所以往他所指向的位址裡賦值會導致不可預知的錯誤。double
*p;*p=
1.2;
因此,我們在定義指標變數時常常會將其初始化為null(實際上就是0),表示未指向任何儲存空間
「&」和「*」double
*p=0
;double
*q=null
;
「&」——取位址運算子,其運算元包括普通變數和指標變數。
「*」——間接引用運算子,也稱指標運算子,其運算元必須是指標變數,否則編譯時候會報錯。
兩者優先順序相同,結合方向都是自右向左。故&p相當於&(p),&p相當於(&p)
算術運算
指標變數相加減的操作是沒有意義的,因為位址的相互加減是沒有意義的。但是指標變數能進行自加自減乙個整數的操作,但不同與普通變數的加減,指標變數的增減是以指標變數基型別所佔位元組大小為單位的,即每次增減1,位址值變化是乙個基型別所佔的儲存空間的位元組數,如對int型別的指標加1,位址值實際增加了sizeof(int)個位元組。
如果兩個指標變數的位址值相差了n*sizeof(基型別)個位元組,則p-q=n。例如
則輸出的值為3.int a[
100]=;
int*k=a;
int*o = a +3;
printf
("%d"
, o-k)
;
關係運算子
指標變數參與的關係運算可用於比較位址變數的大小,如果指標p儲存的位址值小於q的,則p乙個陣列包含若干個同資料型別的陣列元素,這些元素相當於變數,各自有儲存空間和相應的位址,而且在記憶體中是連續存放的,佔據若干個相同大小的儲存空間。c語言中,用陣列名表示陣列第乙個元素的位址,因此,陣列名實際上是乙個指標常量,故有a和&a[0]等價。
若有
則(a+i),*(p+i),a[i],p[i]是等價的。*int a[10]
=;int*p=a;
二維陣列的行指標與列指標
設有這樣的陣列二維陣列名表示的是乙個行位址,每+1則向下指一行,a[i]+j表示乙個列位址,每次j+1,
向右移動一列。
那麼a,a+1,a[0],a[0]+1,&a[0],&a[0]+1,&a[0][0],&a[0][0]+1分別是何意義int a[3]
[2];
這時候,為了方便看,不妨將&和末尾的乙個抵消,剩下的與原來的等價型別
表示形式
含義位址運算
行位址a+i或&a[i]
第i行的位址
a+i+1指向下一行
列位址*(a+i)+j或a[i]+j
第i行第j列元素位址
*(a+i)+j+1指向下乙個元素
元素*( *(a+i)+j)或a[i][j]
第i行第j列元素
n/a行位址轉列位址,加「*」,列位址轉行位址,加「&」。
用一級指標訪問二維陣列元素
由於二維陣列的元素還是連續存放的,所以乙個m行n列的二維陣列可以看做是長度為m*n的一維陣列
用行指標變數訪問二維陣列元素
語法
型別標識指示符 (*指標變數名)[整型常量表示式];
示例
示例中定義的行指標變數p,他指向的是長度為2的一位整型陣列,其基型別為int[2],這樣p+1時,指標移動2*sizeof(int)個位元組。int
(*p)[2
];
此時int
(*p)[2
];int a[3]
[2];
p=a;
函式呼叫過程中,資料從實參傳到形參,是把實參的值單向複製到形參中。如果實參給形參傳遞的是位址值,則稱位址呼叫,簡稱為傳位址。否則稱為值呼叫,簡稱為傳值。p+i等價於a+i
p[i]等價於a[i]
p[i]
[j]等價於a[i]
[j]
指標作為形參返回多個值
鷓鴣菜的C語言複習 第一章
馮諾依曼的主要貢獻是提出了程式儲存的思想 另乙個重大貢獻是建議在電子計算機中使用二進位制 馮諾依曼機具備五大基本組成部件,包括 儲存器分為記憶體外存 記憶體外存 暫時的少量的資料和程式 永久儲存的大量的資料 記憶體是計算機中的重要組成部分,記憶體通常由若干個儲存單元組成 進製轉換 大小 1b8bit...
鷓鴣菜的C語言複習 第三章
更具運算物件的個數,運算子可分為三類 c語言的表示式由運算子和運算物件組成,任何乙個表示式都有乙個確定的值,稱為該表示式的值 戳這裡,超詳解 函式名功能 sqrt x 計算x的平方根,x應當 0 fabs x 計算x的絕對值 log x 計算ln x log10 x 計算lg x exp x 計算e...
鷓鴣菜的C語言複習 第六章
陣列中所含的每個資料稱為陣列元素,它們具有相同的資料型別。語法型別識別符號 陣列名 整形常量表示式 其中 型別識別符號表示陣列中元素的資料型別 陣列名是由使用者自定義的識別符號 整形常量表示式是陣列長度,必須是個常量,當然這不是說陣列就只能定義固定長度的,後面章節涉及到申請動態記憶體空間 可以通過下...