一、指標的運算
指標可以進行三種運算:
1.指標加上整數:
如果指標p指向陣列a[i],那麼指標p + j 指向a[i + j](前提是a[i + j]存在!)
2.指標減去整數:
如果指標p指向陣列a[i],那麼指標p - j 指向a[i - j](前提 a[i - j] 存在!)
3.兩個指標相加減(兩指標必須指向同一變數!!!否則運算沒有意義的!)
當兩個指標相減時,結果是指標在記憶體上的距離,可以用陣列元素的個數來度量,所以如果指標p指向a[ i ],q指向a[ j ],那麼p - q就等於i - j.
指標比較:指標可以使用 > = <= == != 等符號進行比較,(也是只有在指標指向同一陣列時,使用關係運算子進行的指標比較才有意義!)
二、指標用於陣列的處理
由於指標的算術運算,所以我們可以通過指標的自增自減來訪問陣列的元素。
#includeint main()
; int *p;
for(p = &a[0];*p < a[10];p++)
return 0;
}
使用陣列下標可以寫出不用指標的迴圈,有一種論調說使用指標可以節省時間,不過對於現在的編譯器來說,實際上會自動對使用下標的迴圈進行優化,即依靠下標的迴圈會產生更好的**(大佬說的 [^.^])
*和++組合使用:
#includeint main()
; int *p = &a[0];// *p = a;
while (*p < a[10])
return 0;
}
當然還有*++p、(*p)++
三、用陣列名作為指標
1.可以用陣列名作為指向陣列第乙個元素的指標。例如int a[10] ; *a = 7 ;這樣就是把a[0]元素給他賦值7。通常情況下a + i 就相當於&a[i] ,*(a + i) 就相當於a[i]。
2.陣列變數本身表達位址,所以用陣列對指標初始化不用&取位址符號,int a[10]; int *p = a; 。但是陣列的每乙個元素表達的是乙個變數,需要取位址符&。
3.[ ]也可以對指標做,p[0] 相當於a[0] 。*也可以對陣列做, *a 相當於a[0]。
注意:當陣列變數是乙個const型別的指標,就不能被賦值了!
4.陣列作為函式引數
下面我們看乙個有趣的東西( it's amazing!):
#includevoid test1(int a);
int main()
; printf("main中sizeof(a) = %lu\n",sizeof(a));
test1(a);
return 0;
}void test1(int a)
執行結果如下:
在函式test1中sizeof傳進去的陣列我們發現他的位元組大小是8!而不是陣列本身的位元組大小 20!有趣吧哈哈哈哈qaq。這是因為陣列作為引數傳參的時候傳進去的是乙個指標!就是之前我們說了的陣列變數是乙個特殊的指標。陣列名在傳遞給函式的時候總是被視為指標。
這對我們有很大的意義!:
(1).在給函式傳遞普通變數時,變數的值會被複製,任何對相應的形式引數的改變都不會影響到變數。而作為實際引數的陣列我們可以改變(除非const了一下它)!
(2).給函式傳遞陣列的時間與陣列的大小半毛錢關係都沒有!(編譯器:「我根本就沒對你陣列進行複製,沒想到吧!哈哈哈」)
(3).我們可以在需要的時候吧陣列形式引數宣告為指標。(編譯器對陣列和指標的宣告完全看做是一樣滴)
注意:對於形式引數而言,宣告為陣列跟宣告為指標是一樣的;但是對於變數而言宣告為陣列跟宣告為指標是不同的!
5.用指標名當做陣列名(如下**)
四、指標與多維陣列
int a[4][5] = ,,,};
可以把這個理解為包含四個行元素的陣列:a[0]、a[1]、a[2]、a[3],可以把a[0]
還需要記住的是陣列名為首元素的位址。有這樣的說法a不是a[0][0]的位址,但是我試了一下,結果是它們位址相同,所以總結成一句話:陣列名為首元素位址。
行指標:乙個二維陣列每一行視為乙個一維陣列,指向每一行的一維陣列的指標。
處理多維陣列的行:
#includeint main()
,,,};
int *p,i = 0,j = 4;
i = 3;
for (p = a[i];p < a[i] + j;p++)//p = a[i]給p初始化.p < a[i] + j 中a[i]+j表示的是a[i][j]
printf("%d\n",a[i][2]);//輸出驗證第i行第2列是否為0
return 0;
}
p++執行一次之後 就相當於 p +1 就相當於 a[i] +1 就相當於 a[i][1]
處理多維陣列的列:
#includeint main()
,,,};
int (*p)[5],i = 2;//(*p)的括號不可省略![5]這個表示的是一維陣列的長度,不可省略!定義了乙個行指標,其寬度為5(即二維陣列的列數為5)
for ( p = &a[0]; p < &a[4];p++)//p=&a[0]是把第0行那個一行的一維陣列的位址交給p這個行指標 &a[4]相當於a+4. p=&a[0]相當於p=a
printf("%d\n",a[2][i]);//輸出驗證第2行第2列是否為0
return 0;
}
C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標 指標與陣列
1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...
C語言 陣列指標與指標陣列區別
陣列指標 也稱行指標 int p n 優先及高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。int a 3 2 int p 2 p a p 該語句執行後,也就是p p 1,p跨過a 0 指向了a 1 所以...