c語言指標和陣列

2021-05-22 14:46:38 字數 3174 閱讀 1566

1、指標陣列問題和  指向陣列的指標。

int multi[2][4];

int (*p)[4];  //如果我寫成 int *p 可以麼?;

p = multi;

這是  多維陣列 和指標的關係, 指標陣列比較容易理解。

指標陣列: 是乙個陣列,裡面都放著某種型別的指標。

陣列指標: 指向陣列的指標

int * b=new int[10]; 指向一維陣列的指標b ; 

2、 函式指標  int  (*func)(int x);

這是乙個指標,該指標指向函式

如果   int    *func (int x) ;

這是乙個函式。函式的反回值是乙個指標

3,  int rollnum[30][4];

int (*p)[4]=rollnum;

int *q[5];

p被宣告為乙個指向乙個4元素(int型別)陣列的指標,

而q被宣告為乙個包含5個元素(int型別的指標)的陣列。

4   int **p1; // 合法

int *&p2; 合法

int &*p3; // 不合法

int &&p4; 不合法

5  const修飾符

當你想阻止乙個變數被改變,可能會用到const關鍵字。在你給乙個變數加上const修飾符的同時,通常需要對它進行初始化,因為以後的任何時候你將沒有機會再去改變它。例如:

const int n=5;

int const m=10;

兩者是等價的

6  const int *p;

int const *q;  p和q都被宣告為const int型別的指標。 即 *p *q 的值不能在改變

int * const r =&n;  r 是乙個const 指標。申明時候指向n 不能在變,而n 中的內容即 *r 是可以變的

7  這是乙個簡單的法則,但能讓你準確理解所有的宣告。這個法則運用如下:從最內部的括號開始閱讀宣告,向右看,然後向左看。當你碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個宣告都被分析完畢。

對上述「右左法則」做乙個小小的修正:當你第一次開始閱讀宣告的時候,你必須從變數名開始,而不是從最內部的括號。

下面結合例子來演示一下「右左法則」的使用。

int * (* (*fp1) (int) ) [10];

閱讀步驟:

1. 從變數名開始 -------------------------------------------- fp1

2. 往右看,什麼也沒有,碰到了),因此往左看,碰到乙個* ------ 乙個指標

3. 跳出括號,碰到了(int) ----------------------------------- 乙個帶乙個int引數的函式

4. 向左看,發現乙個* --------------------------------------- (函式)返回乙個指標

5. 跳出括號,向右看,碰到[10] ------------------------------ 乙個10元素的陣列

6. 向左看,發現乙個* --------------------------------------- 指標

7. 向左看,發現int ----------------------------------------- int型別

8  (*ptr)++;    值加一

ptr++;     位址加一  

9  p=&a;//&a的結果是乙個指標,型別是int*,

10   二維陣列指標

例如a[0]陣列,含有a[0][0],a[0][1],a[0][2],a[0][3]四個元素。

從二維陣列的角度來看,a是二維陣列名,a代表整個二維陣列的首位址,也是二維陣列0行的首位址,等於1000。a+1代表第一行的首位址,等於1008。如圖:

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)。 11

指向多維陣列的指標變數

把二維陣列a分解為一維陣列a[0],a[1],a[2]之後,設p為指向二維陣列的指標變數。可定義為:

int (*p)[4]

它表示p是乙個指標變數,它指向包含4個元素的一維陣列。若指向第乙個一維陣列a[0],其值等於a,a[0],或&a[0][0]等。而p+i則指向一維陣列a[i]。從前面的分析可得出*(p+i)+j是二維陣列i行j 列的元素的位址,而*(*(p+i)+j)則是i行j列元素的值。

二維陣列指標變數說明的一般形式為:

型別說明符  (*指標變數名)[長度]

其中「型別說明符」為所指陣列的資料型別。「*」表示其後的變數是指標型別。「長度」表示二維陣列分解為多個一維陣列時,一維陣列的長度,也就是二維陣列的列數。應注意「(*指標變數名)」兩邊的括號不可少,如缺少括號則表示是指標陣列(本章後面介紹),意義就完全不同了。 12

void f1(int *, int);

void f2(int *, int);

void(*p[2]) (int *, int);

p[0] = f1;

p[1] = f2;   理解這個

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...

C語言指標陣列和陣列指標

初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...