C 指標和陣列 二級指標和二維陣列

2021-07-06 04:53:34 字數 2660 閱讀 1696

1)、陣列名代表的是陣列首元素的位址,這是乙個常量。即陣列已經定義,它的含義便已經明確了,陣列就是乙個固定記憶體塊大小的別名

2)、陣列首元素的位址和陣列的位址是不同的東西

3)、陣列也是一種陣列型別,其型別由構成陣列的元素的型別和陣列的大小一起決定

現在對上面所提到的內容進行一下詳細的解釋:

看乙個例子

我們可以看到,陣列一經定義,不管有沒有顯示初始化,其所指向的記憶體空間便已經定了下來。

我們都知道,陣列一經定義,其大小便確定下來了,所以我們直接用sizeof(array_int1)來得到陣列的大小,經過測試,sizeof(array_int1) = 40;

現在再求sizeof(&array_int1),可以得到sizeof(&array_int1) = 4。為什麼會時上面的結果呢?

上面說了,陣列型別是由構成陣列的元素的型別和陣列的大小一起決定。例如:int  array_int1[10],便是代表一種int [10] 的資料型別, 同理  float  f_float1[12] 便是代表一種float [12]的資料型別。既然是這樣,我們便可以定義乙個陣列型別,使用typedef  ,例如  typedef  int  (array_int)[5], typedef double (ayyay_double)[4] 。

很明了吧,有一點需要注意的就是,在定義一種陣列型別的時候,陣列名一定要括起來,這種定義的方法可能和其他的typedef不大一樣。或許你還想知道,這樣的型別有什麼用,不要著急,後面會講到的,現在我們先把上面的問題完成了再說。

既然明白了陣列型別了,那我們就能夠明白為什麼sizeof(array_int1) = 40 ,而 sizeof(&array_int1) = 4。這是因為,變數array_int1是一種int [10]的資料型別,那麼&array_int1便是對這個變數求位址了,並且,在32位系統下,不管是內建型別還是自定義型別,對該型別的變數求位址後用sizeof() 運算子,得到的都是4。

二維陣列的定義和初始化和一維陣列類似,這裡不再多說。值得注意的有兩點:

1)、任何陣列初始化的時候不能初始化為空;  int a[10];  a[10] = {};//這是錯誤的,因為不能將陣列指向一塊不存在的記憶體空間

2)、在使用多維陣列時,我們要把多維陣列當做是陣列的陣列。

二維陣列的下標操作符和一維陣列的沒有區別,理解的時候需要記住,a[8] = *(a+8)。

二維陣列在上述基礎上,我們可以用多種方式來訪問二維陣列了。

#include using namespace std;

#define pi 3.14

//初始化陣列

上述例子中提供了多種訪問二維陣列的方法,整個程式如果詳細講解的話過於累贅,我只介紹一下二維陣列的遍歷,其他地方如果還有什麼不懂的地方可以相互交流。

1)、這種遍歷方式(    p[i][j] = i*j;   )想必大家都懂,

2)、 *(*(array+i)+j) = pi*i*j;//主要是這種方式。

在一維陣列中已經講了陣列遍歷的兩種方式,(*a+6) = a[6];。還有乙個就是二維陣列中的每一行也是乙個陣列。

對於array[3][4]而言,每乙個array[i]都是乙個有四個元素構成的陣列,而array[i]可以表示成  *(array +i),所以 array[i][j] 便可以表示成 *(*(array+i)+j)          

一維陣列當然對應一維指標:

int a[10] ;要將陣列作為實參,則形參中應該寫成這樣  int * p;

二維陣列需要二維指標:

char ch[10][20];要將陣列作為實參,則形參中應該按照下面的方式來寫  ch (*pch)[20];//注意,形參中(*pch) 的括號不能少,中的數字必須要和實參中的對應

至於還有的一種方法  char ch[20]或是char ch[10][20],這樣寫並沒有錯,只是在程式書寫中顯得並不是特別的規範,所以盡量不要採用。

二維陣列 指標陣列 陣列指標 二級指標

include 指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an array,即指向陣列的指標 int a 4 指標陣列 表示 陣列a中的元素都為int型指標 優先順序高於 元素表示 a i int a 4 陣列指標...

二維陣列和二級指標

前兩天寫個程式,傳引數的時候想傳個二維陣列進去,結果悲劇了,函式寫成fun int p 原來沒有這麼寫過,以為這麼寫也是對的,結果錯了,查了些資料,做個總結。fun int p 這裡面的int p 這裡的p不是二維陣列的指標,而是指向指標的指標,即二級指標。正確的二維陣列的指標應該是 int a 2...

二級指標和二維陣列詳解

乙個函式形如 void f float p float p 其實這裡的p並不是乙個二位陣列的指標,只不過是乙個指向指標的指標 像你這樣訪問肯定是會出問題的。例如 float a 2 2 float p float a 強制將二維陣列指標轉為指向指標的指標 則此時p 0 0 p 1 1 p 2 2 p...