**:
在c語言中對於下面的兩種情況,是否相同呢?
char a = "abcdefg";---------------1
char *p = "abcdefg";-----------------2
在談到這些區別時,應該先談一下計算機中對變數是如何儲存的。從編譯原理中我們知道,對於所有的變數他都會影射到乙個符號表中。為了簡化,這裡給出一種最簡單的便於理解的符號表:
a0xffaa
p0xffcc
表1 乙個簡單的符號表示例
以上**中a代表乙個變數,0xffaa則為變數a的內容的儲存位址;p代表另乙個變數,0xffcc為變數p的內容的儲存位址。對於陣列型的變數和指標型的變數,其位址代表的含義不同。
對於陣列a:
步驟一、取出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 該語句是定義乙個陣列指標,指向...