陣列與指標的區別

2021-06-05 12:46:01 字數 1630 閱讀 1328

在c語言中對於下面的兩種情況,是否相同呢?

char a = "abcdefg";---------------1

char *p = "abcdefg";-----------------2

在談到這些區別時,應該先談一下計算機中對變數是如何儲存的。從編譯原理中我們知道,對於所有的變數他都會影射到乙個符號表中。為了簡化,這裡給出一種最簡單的便於理解的符號表:

a0xffaa

p0xffcc

表1 乙個簡單的符號表示例

以上**中a代表乙個變數,0xffaa則為變數a的內容的儲存位址;p代表另乙個變數,0xffcc為變數p的內容的儲存位址。對於陣列型的變數和指標型的變數,其位址代表的含義不同。

對於陣列a:

這個0xffaa位址就是其存放陣列內容的首位址了。對於a[i]的引用步驟如下:

步驟一、取出i的值,將他與0xffaa相加;

步驟二、取出為(0xffaa+i)中的內容。

對於指標p:

這個0xffcc位址就是中存放的不是字串的內容,而是乙個位址,這個位址才是字串的首位址,對p[i]或者用指標表示*(p+i)的應用步驟如下:

步驟一、取出0xffcc位址中的內容,例如為0xffdf;

步驟二、取出位址0xffdf中的內容。

陣列和指標的對比如下圖:

下面是在vc6.0下作的乙個試驗,通過這個試驗大家可以看到,雖然同過和通過*引用都一樣,但在內部處理的方法是不一樣的。

#include "stdafx.h"

#include "stdio.h"

int main(int argc, char* argv)

;int *p =a;

printf("a:%d,&a:%d,a[0]:%d,*a:%d,p:%d,&p:%d,*p:%d,p[0]:%d",a,&a,

a[0],*a,p,&p,*p,p[0]);

return 0;

}輸出結果:

a:1310580,&a:1310580,a[0]:1,*a:1,p:1310580,&p:1310576,*p:1,p[0]:1。

由上面的分析可知,如果在乙個檔案中定義了乙個陣列int maychar[100],那麼下面的宣告就是完全錯誤的。

extern int *maychar;

這樣的話,在引用時他就會按照指標的方法來引用陣列。正確的宣告應該是exter int maychar;這裡陣列的大小並不重要。下面將指標與陣列的區別用**的形式列出如下:

指標陣列

儲存資料的位址

儲存資料

間接訪問資料

直接訪問

通常用於動態資料結構

通常用於儲存固定數目資料型別相同的元素

相關操作malloc(),free()等

隱式分配和刪除

同常指向匿名資料

自身即為資料名

表2 指標與陣列的區別

還要提醒一點的就是:

char a = "abcdefg";---------------陣列內容能修改(字元陣列)

char *p = "abcdefg";-----------------內容不能修改(字串常量)

在ansi c中,初始化指標是所建立的字串時常量,被定義為唯讀,如果試圖通過指標修改這個字串的值,程式就會出現為定義的行為。

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,...

陣列指標與指標陣列的區別

一 陣列指標 也稱行指標 定義int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指...

陣列指標與指標陣列的區別

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...