關於陣列和指標

2021-09-30 12:19:04 字數 2317 閱讀 8479

1. 先來看幾個例子,你能說出這幾個表示方法的意義和不同點嗎?

a. int *p[10]  //10個指向int型別的指標,陣列裡面的型別是int *,這個方式叫指標陣列,可以轉化成二級指標;

b. int (*p)[10]  //指向乙個有10個int成員的陣列,其實也就是乙個2維陣列p[10],確定的第二維的長度是10,陣列裡面物件的型別是int,這種方式叫陣列指標,可以轉化成二維陣列;

c. int (*p)(int)  //指向乙個形參表為1個int型別,返回值為int的函式指標

d. int *p(int a) //這個是乙個指標函式,函式返回的是乙個位址,使用在在返回陣列某乙個元素的位址上;

e. int (*p[10])(int) //指標陣列指標函式的結合:定義乙個指標陣列,陣列中每個成員均是int (*p)(int) 的指標;

這幾種表示方法經常出現在程式中,很容易使人混淆,需要注意的是:c語言經常用函式指標的方式實現面相物件的功能,在動態呼叫過程中,把實現不同功能的類似函式通過函式指標的形式賦值給真正呼叫的函式,來實現面相物件的過程。

2. 多維陣列和指標

例如:整型二維陣列a[3][4]:

0  1  2  3

4  5  6  7

8  9  10  11

設陣列a的首位址為1000,c語言允許把乙個二維陣列分解為多個一維陣列來處理。因此陣列a可分解為三個一維陣列,即a[0],a[1],a[2]。每乙個一維陣列又含有四個元素。例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。

陣列及陣列元素的位址表示如下:a是二維陣列名,也是二維陣列0行的首位址,等於1000。a[0]是第乙個一維陣列的陣列名和首位址,因此也為1000,*(a+0)或*a是與a[0]等效的, 它表示一維陣列a[0]的0號元素的首位址,也為1000,&a[0][0]是二維陣列a的0行0列元素首位址,同樣是1000。

因此,a,a[0],*(a+0),*a,&a[0][0]是相同的。同理,a+1是二維陣列1行的首位址,等於1008。a[1]是第二個一維陣列的陣列名和首位址,因此也為1008。&a[1][0]是二維陣列a的1行0列元素位址,也是1008。因此a+1,a[1],*(a+1),&a[1][0]是等同的。由此可得出:a+i,a[i],*(a+i),&a[i][0]是等同的。此外,&a[i]和a[i]也是等同的。因為在二維陣列中不能把&a[i]理解為元素a[i]的位址,不存在元素a[i]。c語言規定,它是一種位址計算方法,表示陣列a第i行首位址。由此,我們得出:a[i],&a[i],*(a+i)和a+i也都是等同的。另外,a[0]也可以看成是a[0]+0是一維陣列a[0]的0號元素的首位址,而a[0]+1則是a[0]的1號元素首位址,由此可得出a[i]+j則是一維陣列a[i]的j號元素首位址,它等於&a[i][j]。由a [i]=*(a+i)得a[i]+j=*(a+i)+j,由於*(a+i)+j是二維陣列a的i行j列元素的首位址。該元素的值等於*(*(a+i)+ j)。

試一下以下程式段

#define pf "%d,%d,%d,%d,%d,\n"

int main(void)

; printf(pf,a,*a,a[0],&a[0],&a[0][0]);

printf(pf,a+1,*(a+1),a[1],&a[1],&a[1][0]);

printf(pf,a+2,*(a+2),a[2],&a[2],&a[2][0]);

printf("%d,%d\n",a[1]+1,*(a+1)+1);

printf("%d,%d\n",*(a[1]+1),*(*(a+1)+1));

return 0;

}執行結果如下:(注意,是列印的10進製數)

其中陣列位址資訊如下:

說明:0x003a7038的十進位制為3829816

3. 二級指標做引數

通過下面的例子來了解二級指標做函式引數時,主函式對此函式是怎麼呼叫的。

#include "stdio.h"

typedef struct tst

tst_t;

typedef struct student

stu_t;

void fun(stu_t **p)

else

else }

}}int _tmain(int argc, _tchar* ar**)

關於陣列指標和指向陣列指標的指標及其new

後來在wp123456xt的csdn的博文上看到他的一篇求助文章 陣列指標問題 求指教 也無人回答,閒來無事,就一一解釋下吧,這些理解都屬於一家之見,也許其中的一些理解上會有問題,還希望大家指出,共同進步嘛。includeusing namespace std int main q new floa...

關於指標陣列和陣列指標

陣列指標 舉例說明 int p 5 陣列指標的英文是 a pointer to an array 也就是指向陣列的指標。通過int p 5 p 是宣告,宣告p是乙個指標,它指向的內容是int 5 這個陣列。簡單運用下 int a 5 int p 5 a 這裡的意思也就是a是個五位的陣列,而p指向陣列...

關於「指標陣列」和」陣列指標「

我一直弄不清楚 指標陣列 和 陣列指標 的區別,最近這段時間看到了一些關於陣列和指標的關聯和區別的資料,然後總結了下這兩個概念的區別,以備後續檢視。1 區分指標陣列和陣列指標 short ptr 10 指標陣列,可理解為 存放指標的陣列 short ptr1 10 陣列指標,可理解為 指向陣列的指標...