C語言指標 指標與陣列

2021-10-22 17:26:34 字數 3187 閱讀 5641

一、指標的運算

指標可以進行三種運算:

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 所以...