陣列和指標的關係

2021-07-30 06:51:06 字數 3341 閱讀 7077

指標和陣列有什麼關係呢?

有些人認為指標就是陣列,陣列就是指標,這種說法是錯誤的,指標就只是指標,陣列也只是陣列,它們之間是沒有任何關係的

比較1:求陣列大小和指標位元組的大小

先明確一點即使我用sizeof(p)這種方式也不能說成sizeof是乙個函式,sizeof只是乙個關鍵字,不要被表象所迷惑。

如果你把指標當成陣列,那麼指標大小豈不是8個位元組,而我們知道在32為平台下,指標的大小永遠是4個位元組,那如果你把陣列當成指標那豈不是只有4個位元組。因此單從這一點來看你就不能弄錯。

比較2、以指標的方式和以下標的方式去訪問指標

我們都知道在這裡p是乙個指標變數,在棧上佔4個位元組,而在p儲存的是字串常量的首位址,字串常量是在靜態全域性區的,因此這是靜態全域性去的位址。我們並不知道這塊位址的名字,因此這種是完全匿名的方式這個字串常量的位元組大小為8.如果我們要訪問裡面的元素我們可以通過指標的形式去訪問

比如如果我們要訪問字串常量中的d

1)以指標的形式去訪問:*(p+3);

p儲存的是這個字串常量的首位址,給指標+1實際上是加上型別的位元組的大小,因此加3相當於加上sizeof(char)*3因此通過這種方式可以訪問到d

比較3、以指標的方式和以下標的方式去訪問陣列

我們都知道陣列array是儲存在棧中的,如果我們要拿到陣列的首位址必須通過這個陣列名得到,如果要去訪問陣列中的元素則可以通過對這個陣列名加上所需要的偏移量。因此這是一種具名+匿名的方式

1)以指標的方式去訪問陣列:*(array+3)

先通過array的到陣列的首位址,再加上3個字元的偏移量(這個偏移量指的是元素的偏移量)的到字元d的位址再解引用得到字元d

可以看出指標和陣列沒有關係,只是它們訪問的方式相似,指標是完全匿名訪問,陣列則是具名+匿名的訪問方式

此外還要注意一點我們是不能去修改字串常量的值的因為它儲存在靜態全域性區,只具有讀屬性。

比較4:宣告為陣列,定義為指標,和宣告為指標,定義為陣列

首先我們要分清楚宣告和定義的區別:

宣告:沒有為這個變數分配記憶體,因此可以宣告多次

定義:為變數實際分配了記憶體,只能定義一次,這個變數的位址以後是不變的。因此不能多次定義乙個變數。

extern 的注意事項:如果在乙個.c檔案裡使用extern 關鍵字來表示使用在另一.c檔案裡定義的變數或者函式,那麼這個變數或者函式必須是全域性的。並且extern int a的時候是不能對它進行初始化的,也就是你不能寫成extern int a=10的這種情況。

宣告為陣列,定義為指標

在a.c檔案裡定義乙個指標變數p儲存字串常量的首元素的首位址

char *p = 「abcdefgh」;

在b.c檔案裡使用extern 來宣告成陣列

extern char p[4]

也即是在b.c的檔案裡會認為變數p是乙個陣列,存放了9個char型別的元素,但注意這是宣告不是定義,並沒有實際為這個變數p分配記憶體空間,它的記憶體空間是在a.c中定義的時候分配的,但是在a.c檔案中我們定義的是指標型別,也就是p只佔了4個位元組大小。但是我們的b.c檔案並不知道,依舊把它當成陣列去使用。

但是我們p在a.c檔案裡儲存的是字串常量的位址

如果們在b.c的檔案裡把p當成陣列使用是什麼情況?

如果你在b.c檔案中把p當成陣列使用那麼

很明顯這並不是我們所需要的某塊記憶體的位址並且如果我們對這裡的p[i]進行賦值也會導致我們指標變數p原來儲存的位址被改變,無法再找到原來指向的真正的位址。這就很可怕了。

宣告為指標,定義為陣列:

在a.c檔案裡定義乙個陣列

char p = 「abcdefgh」;

在b.c檔案裡使用extern 來宣告乙個指標

extern char *p;

如果我們在b.c檔案中使用這個指標,我們都知道在a.c檔案中陣列p大小是9個位元組裡面儲存的是字元,但是p作為指標只能看到前4個位元組

由於我的計算機是小端模式因此會是64 63 62 61

指資料的高位元組儲存在記憶體的高位址中,而資料的低位元組儲存在記憶體的低位址

注意這裡的64 63 62 61都是16進製制對應10進製為 d c b a的ascii碼,因此從這我們看出這個指標變數p的位址其實是陣列的前4個元素的acsii值

而如果我們再b.c檔案中對這個p裡面儲存的位址可能就不是乙個有效位址。

於是訪問這個位址裡的內容程式崩潰了:

由此可見指標是一把雙刃劍,你既可以利用它去訪問你需要的內容,但也可能因為它導致非法訪問記憶體導致程式崩潰。

聯想到之前的陣列指標,指標陣列,就順便一起再整理整理

指標陣列:指標陣列是陣列

int *p1[10]

[ ]的優先順序高於*,因此p先和因此就先構成了陣列的定義,陣列名為p1,陣列裡存放的是10個指向int型別的指標

陣列指標:陣列指標是指標

int (*p2)[10]

()的優先順序最高,因此p2先和*結合形成了指標的定義,指標變數名為p2,p2指向的是乙個具有10個int型別的陣列

陣列和指向陣列的指標的關係

看下面的程式,輸入什麼?include intmain int p int a 1 printf p d n a printf p d n a 1 printf p d n p 1 return0 結果是 p 1p 2p 5a 其實就是乙個指標 指向第一元素,所以 a就是1 a 1是指標的偏移,偏移...

指標和一維陣列關係

include int main int ptr score ptr score score 陣列名為陣列首位址,和陣列首元素的位址一致。printf n第一種表示方法 n for i 0 i 5 i printf n第二種表示方法 n for i 0 i 5 i printf n第三種表示方法 n...

二維陣列和指標的指標的關係?

首先說 沒有關係!先告訴自己三遍 沒有關係,沒有關係,沒有關係 例 include intmain void int p1 arr 0 一級指標 int p2 arr 二級指標,即指標的指標 int p3 2 arr 指向乙個內含兩個int型別值陣列 printf p2 d n p2 printf ...