1樓:冰紅茶配黃燜雞
陣列名確實表示指向陣列首地址的指標,但這個指標很特別,它的值(指標的值指的是指標所指的地址)不能被改寫,能改寫的僅僅是其指向的內容,換句話說,陣列名只能指向陣列的首地址,如果有陣列char a;那麼如果出現a = a+1;這是編譯都通不過的錯誤。而對於一個普通的指標是可以的,再比如有陣列char a;那麼再定義一個char *p = a;然後再用p = p+1是合法的,這表示讓指標p指向&a[1]。
它們的第二個區別是:每當用到陣列名這個指標的時候,系統都會傳入陣列的資訊,而普通的指標只是一個4位元組的整數,例如:
char a[5];
char *p = a;//指標a和指標p都指向陣列a的首地址cout << sizeof (a) << "##" << sizeof (p) << endl;
這時的執行結果是「5##4」
c/c++中,陣列名和指標的區別
2樓:匿名使用者
一維陣列 可以認為是常量一維指標. 即除了不能修改值, 其他都可以當指標操作.
多維陣列, 可以認為是對應的陣列指標.
陣列名和指標最大的區別是, 陣列名自身不佔用記憶體空間, 即&陣列名得到的地址還是陣列名值本身, 亦即陣列首地址. 而指標是有自己的記憶體空間的, &指標變數, 得到的是另外一個地址.
陣列指標和指標陣列的區別
3樓:匿名使用者
陣列指標(也稱行指標)
定義 int (*p)[n];
()優先順序高,首先說明p是一個指標,指向一個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。
如要將二維陣列賦給一指標,應這樣賦值:
int a[3][4];
int (*p)[4]; //該語句是定義一個陣列指標,指向含4個元素的一維陣列。
p=a; //將該二維陣列的首地址賦給p,也就是a[0]或&a[0][0]
p++; //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]
所以陣列指標也稱指向一維陣列的指標,亦稱行指標。
指標陣列
定義 int *p[n];
優先順序高,先與p結合成為一個陣列,再由int*說明這是一個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下一個陣列元素,這
樣賦值是錯誤的:p=a;因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以用來存放變數地
址。但可以這樣 *p=a; 這裡*p表示指標陣列第一個元素的值,a的首地址的值。
如要將二維陣列賦給一指標陣列:
int *p[3];
int a[3][4];
p++; //該語句表示p陣列指向下一個陣列元素。注:此陣列每一個元素都是一個指標
for(i=0;i<3;i++)
p[i]=a[i]
這裡int *p[3] 表示一個一維陣列記憶體放著三個指標變數,分別是p[0]、p[1]、p[2]
所以要分別賦值。
這樣兩者的區別就豁然開朗了,陣列指標只是一個指標變數,似乎是c語言裡專門用來指向二維陣列的,它佔有記憶體中一個指標的儲存空間。指標陣列是多個指標變數,以陣列形式存在記憶體當中,佔有多個指標的儲存空間。
還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。
比如要表示陣列中i行j列一個元素:
*(p[i]+j)、*(*(p+i)+j)、(*(p+i))[j]、p[i][j]
優先順序:()>>*
4樓:千鋒教育
指標陣列:array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標。
陣列指標:a pointer to an array,即指向陣列的指標。
還要注意的是用法的區別,下面舉例說明。
int* a[4] 指標陣列
表示:陣列a中的元素都為int型指標
元素表示:*a[i] *(a[i])是一樣的,因為優先順序高於*int (*a)[4] 陣列指標
表示:指向陣列a的指標
元素表示:(*a)[i]
注意:在實際應用中,對於指標陣列,經常這樣使用:
typedef int* pint;
pint a[4];
這跟上面指標陣列定義所表達的意思是一樣的,只不過採取了型別變換。
**演示如下:
#include
using namespace std;
int main()
;int *a[4]; //指標陣列
int (*b)[4]; //陣列指標
b=&c;
//將陣列c中元素賦給陣列a
for(int i=0;i<4;i++)
//輸出看下結果
cout<<*a[1]< }注意:定義了陣列指標,該指標指向這個陣列的首地址,必須給指標指定一個地址,容易犯的錯得就是,不給b地址,直接用(*b)[i]=c[i]給陣列b中元素賦值,這時陣列指標不知道指向**,除錯時可能沒錯,但執行時肯定出現問題,使用指標時要注意這個問題。但為什麼a就不用給他地址呢,a的元素是指標,實際上for迴圈內已經給陣列a中元素指定地址了。 但若在for迴圈內寫*a[i]=c[i],這同樣會出問題。總之一句話,定義了指標一定要知道指標指向**,不然要悲劇。 5樓:e時代幽默網 陣列指標,就是一個指向陣列首元素的指標,或者說是指向一個陣列起始記憶體地址的指標。 指標陣列,就是一個陣列中的所有元素型別均為指標,也就是說是一個專門用來存放一堆指標的陣列。 陣列名和指標的區別 6樓:匿名使用者 可以!下面是我學習陣列和指標的總結: (1)指向陣列首地址 對於一維陣列a[10]:陣列的首地址為a; 呼叫:p=a; *(a+i)或者*(p+i) 對於二維陣列a[3][4]:整個陣列的首地址為a[0];呼叫:p=a[0]; *(a[0]+i)或者*(p+i)。此時a代表陣列第一行的地址。 (3)指向陣列的每行 形如:int a[3][4]; int (*p)[4]; p=a; 呼叫:*(*(p+i)+j)例:; int (*p)[4],i,j; cin>>i>>j; p=a; //a代表的是陣列第一行的首地址. cout<<*(*(p+i)+j)< (4)指標陣列 例如:(字串陣列指標法) ; cout< 處理字串還有以下方法: (字元陣列法,c-string法) ;cout< (字串陣列法,string法) ; cout< 三種方法的共同點是name[0]都是代表的"basic"的首地址而非其本身。 (5)指向指標的指標 形如 char **p;例:; p=name+2; cout<<*p< cout<<**p< 分析:*p=name[2]= "c++"的首地址,(通常所說一個字串的「地址」實際上指的是它的「首地址」或者「起始地址」),用cout 輸出的不是字串的首地址而是整個字串(只要把一個字串的起始地址給它,cout就一直往後面輸出,直到遇到結束符'\0'為止),為了證明這一點,請看:string a=「finish」;cout<
故:本例中第一個*p輸出"c++",第二個**p代表"c++"的首地址的內容,即c。 在上一例中,name[0]為"basic"的首地址,輸出"basic",若換成*name[0]則輸出b,若換成name則代表整個陣列的首地址(而不是單個字串"basic"的首地址),所以此時輸出的是整個陣列的首地址。若用*name則輸出整個陣列的首地址的內容,即"basic"(可見字串的首地址內容為單個字元,一維陣列首地址的內容為它的第一個元素,對於二維陣列,比如int a[3][4],a代表的是第一行的地址,所以cout<
7樓:匿名使用者 可以。a是陣列名,相當於陣列的首地址,b是一個指標,int *b = a; 然後b就指向a這個地址,呼叫b[4]就是b+4的地方,也就是a+4這個地方,然後就是同一個地方,所以b[4]等價於a[4] 陣列名和指標的區別? 8樓:百度使用者 可以!下面是我學習陣列和指標的總結: (1)指向陣列首地址 對於一維陣列a[10]:陣列的首地址為a; 呼叫:p=a; *(a+i)或者*(p+i) 對於二維陣列a[3][4]:整個陣列的首地址為a[0];呼叫:p=a[0]; *(a[0]+i)或者*(p+i)。此時a代表陣列第一行的地址。 (3)指向陣列的每行 形如:int a[3][4]; int (*p)[4]; p=a; 呼叫:*(*(p+i)+j)例:; int (*p)[4],i,j; cin>>i>>j; p=a; //a代表的是陣列第一行的首地址. cout<<*(*(p+i)+j)< (4)指標陣列 例如:(字串陣列指標法) ; cout< 處理字串還有以下方法: (字元陣列法,c-string法) ;cout< (字串陣列法,string法) ; cout< 三種方法的共同點是name[0]都是代表的"basic"的首地址而非其本身。 (5)指向指標的指標 形如 char **p;例:; p=name+2; cout<<*p< cout<<**p< 分析:*p=name[2]= "c++"的首地址,(通常所說一個字串的「地址」實際上指的是它的「首地址」或者「起始地址」),用cout 輸出的不是字串的首地址而是整個字串(只要把一個字串的起始地址給它,cout就一直往後面輸出,直到遇到結束符'\0'為止),為了證明這一點,請看:string a=「finish」;cout<
故:本例中第一個*p輸出"c++",第二個**p代表"c++"的首地址的內容,即c。 在上一例中,name[0]為"basic"的首地址,輸出"basic",若換成*name[0]則輸出b,若換成name則代表整個陣列的首地址(而不是單個字串"basic"的首地址),所以此時輸出的是整個陣列的首地址。若用*name則輸出整個陣列的首地址的內容,即"basic"(可見字串的首地址內容為單個字元,一維陣列首地址的內容為它的第一個元素,對於二維陣列,比如int a[3][4],a代表的是第一行的地址,所以cout< 一維陣列 可以認為是常量一維指標.即除了不能修改值,其他都可以當指標操作.多維陣列,可以認為是對應的陣列指標.陣列名和指標最大的區別是,陣列名自身不佔用記憶體空間,即 陣列名得到的地址還是陣列名值本身,亦即陣列首地址.而指標是有自己的記憶體空間的,指標變數,得到的是另外一個地址.c 陣列名和指標的區... 是地址,可以稱作陣列地址,也可以看成第一個元素的地址。舉個例子 include int main int argc,char argv p array printf p 2 d n p 2 return 0 這個程式輸出結果如下 p 2 3 程式的第六行 p array 就是把陣列地址賦值給地址變數... 就是指向一個地址。陣列第一個元素的地址就是陣列地址。你的理解從本質來 上就有問題自 int p1 a不能通過編譯,因為a是二維陣列指標,型別是int 3 無法轉換到int 型。必須用int p1 3 a或者int p1 a 0 才可以。同理int p2 a 0 無法通過編譯,因為a 0 是一個int...C中,陣列名和指標的區別,CC中,陣列名和指標的區別
C語言裡陣列名是地址嗎,C語言中陣列名和指標的區別
關於c語言把陣列名賦予指標的問題