指標與陣列

2022-06-02 13:39:08 字數 3970 閱讀 8427

陣列名可以當作乙個指標如何理解?

陣列的陣列名其實可以看作乙個指標。

(1)示例**如下:

1

int 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)示例**如下:

1

char *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 #include2

using

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個整型資料的長度)。

如果將二維陣列賦給乙個指標,應這樣賦值:

1

int 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的首位址的值。

如要將二維陣列賦給一指標陣列:

1

int *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 #include2

using

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元素的陣列。其實這兩種寫法主要是因為運算子的優先...