陣列名可以當作乙個指標如何理解?
陣列的陣列名其實可以看作乙個指標。
(1)示例**如下:
1int array[10]=,value;
2 value = array[0]; //
也可寫成:value=*array;
3 value = array[3]; //
也可寫成:value=*(array+3);
4 value = array[4]; //
也可寫成:value=*(array+4);
上例中,一般而言陣列名array 代表陣列本身,型別是int[10]。
但如果把array 看做指標的話,它指向陣列的第0 個單元,型別是int*,所指向的型別是陣列單元的型別即int。
因此*array 等於0 就一點也不奇怪了。同理,array+3 是乙個指向陣列第3 個單元的指標,所以
*(array+3)等於3。其它依此類推。
(2)示例**如下:
1char *str[3]=;
6char s[80
];7 strcpy(s,str[0]); //
也可寫成strcpy(s,*str);
8 strcpy(s,str[1]); //
也可寫成strcpy(s,*(str+1));
9 strcpy(s,str[2]); //
也可寫成strcpy(s,*(str+2));
上例中,str 是乙個三單元的陣列,該陣列的每個單元都是乙個指標,這些指標各指向乙個字串。
把陣列名str 當作乙個指標的話,它指向陣列的第0號單元,它的型別是char **,它指向的型別是char *。
*str 也是乙個指標,它的型別是char *,它所指向的型別是char。
它指向的位址是字串"hello,thisisasample!"的第乙個字元的位址,即'h'的位址。
注意:字串相當於是乙個陣列,在記憶體中以陣列的形式儲存,只不過字串是乙個陣列常量,內容不可改變,且只能是右值。
如果看成指標的話,它即是常量指標,也是指標常量。
str+1 也是乙個指標,它指向陣列的第1號單元,它的型別是char**,它指向的型別是 char*。
*(str+1) 也是乙個指標,它的型別是char*,它所指向的型別是char,它指向"hi,goodmorning."的第乙個字元'h'。
總結陣列名:
宣告了乙個陣列type array[n]時,陣列名稱array 就有了兩重含義:
第一,它代表整個陣列,它的型別是type[n]。
第二,它是乙個常量指標,該指標的型別是type*,該指標指向的型別是type,也就是陣列單元的型別。
該指標指向的記憶體區就是陣列第0號單元,該指標自己占有單獨的記憶體區,注意它和陣列第0號單元佔據的記憶體區是不同的。
該指標的值是不能修改的,即類似array++的表示式是錯誤的。
在不同的表示式中陣列名array 可以扮演不同的角色。例如:
在表示式sizeof(array)中,陣列名array 代表陣列本身,故這時sizeof 函式測出的是整個陣列的大小。
在表示式*array 中,array 扮演的是指標,因此這個表示式的結果就是陣列第0 號單元的值。sizeof(*array)測出的是陣列單元的大小。
表示式array+n(其中n=0,1,2,.....)中,array 扮演的是指標,故array+n 的結果是乙個指標,它的型別是type *,它指向的類
型是type,它指向陣列第n 號單元。故sizeof(array+n)測出的是指標型別的大小。在32 位程式中結果是4。
示例**如下:
1 #include2using
namespace
std;34
void
main()
5
上例中,上例中ptr 是乙個指標,它的型別是int(*)[10],它指向的型別是int[10] ,我們用整個陣列的首位址來初始化它。
在語句ptr=&array中,array 代表陣列本身。
陣列指標與指標陣列如何區別?
(1)陣列指標
宣告示例**如下:
int (*p)[n];
()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長(也就是說執行p+1時,p要跨過n個整型資料的長度)。
如果將二維陣列賦給乙個指標,應這樣賦值:
1int a[3][4];2
int (*p)[4]; //
該語句是定義乙個陣列指標,指向含4個元素的一維陣列。
3 p = a; //
將該二維陣列的首位址賦給p,也就是a[0] 或 &a[0][0]
4 p++; //
該語句執行過後,也就是p = p+1; p跨過行a[0]指向了行a[1]
(2)指標陣列
宣告示例**如下:
int *p[n];
優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。
這裡執行p+1是錯誤的,這樣賦值也是錯誤的:p=a;
因為p是個不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它們分別是指標變數可以
用來存放變數位址。
但可以這樣 *p=a; 這裡*p表示指標陣列第乙個元素的值,a的首位址的值。
如要將二維陣列賦給一指標陣列:
1int *p[3];2
int a[3][4];3
for(i=0;i<3;i++)
4 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]
陣列與指標經典例子
示例**如下:
1 #include2using
namespace
std;
3void
main()4;
6char **p=str+1;7
8 str[0]=(*p++)+2
;9 str[1]=*(p+1
);10
11 str[2]=p[1]+3
;12 str[3]=p[0]+(str[2]-str[1
]);13
14 cout<0]空15 cout<1]nanjing
16 cout<2]jing
17 cout<3]g18 }
分析過程說明:
str陣列包含四個元素,每個元素都是乙個指標,每個指標都指向了乙個常量字串
第六行:定義乙個指標p,p指向了第二個元素,其內容(*p)為「to」
第八行:(*p++)==(*p)++;就是第二個元素再加1(指向第三個元素),然後第三個元素再加2,str[0]直接就指向了「未知區」
第九行:(p+1)就是「nanjing」str[1]那就指向了內容「nanjing」
第十一行:p[1]就是第四個元素指標,再加3,剛好為「jing」
第十二行:因為str[1]="nanjing;str[2]=jing;(str[2]-str[1])=3;所以,二級指標p指向內容為「jing」,那麼p[0]+3的內容為「g」。
希望仔細琢磨準確理解。
指標與陣列,指標陣列 陣列指標
int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...
指標陣列與陣列指標
1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...
指標陣列與陣列指標
呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...