c語言指標與陣列問題,c語言陣列與指標相關問題,謝謝

時間 2021-08-14 06:07:21

1樓:匿名使用者

這個問題關鍵在於理解指標為什麼要有型別。其實不同型別的指標本質上都是一樣的,即記憶體地址,地址本身是沒有型別的,賦予指標型別的意義在於給出儲存資料的位元組寬度,也稱資料對齊寬度。比如 int *pt,pt是一個整數指標,那麼編譯器便知道如果通過pt讀取資料時需要一次讀取4位元組,因為那裡存放著一個int。

換句話說指標型別定義了資料訪問時的位元組長度。

int a[3][4]定義了一個固定長度的二維陣列,其行寬為4列int,即4*4位元組為一行,可見對齊寬度為16位元組,也就是每16位元組劃分為一行;行數為3行。其中a代表了陣列首地址,其型別為int (*)[4],地址型別中的長度引數([4])取自於陣列定義,由編譯器確定。陣列定義中包含了維度資訊和記憶體地址及其型別,當通過陣列名訪問元素時必須同時指定行列索引。

為了靈活高效地定址,可以採用指標訪問陣列,那麼指標型別必須和陣列首地址匹配(一致),因此如此定義 int (*p)[4]。可以看出該定義與陣列a的地址型別只是多了個p而已,也就是明確了指標名稱。那麼為什麼編譯器會將 int a[3][4]的地址定義為 int (*)[4]呢?

二維陣列的指標,其運算的基本單位是行寬,因此二維陣列的指標又稱為行指標,假設a的首地址為1000,p指向a,當p++時地址值是增加了一行的寬度,也即加一後p的值為1016而不是1001也不是1004。因此int (*)[4]的含義為其資料寬度為4個int的指標,從而int (*p)[4]的含義為:p是一個指向行寬為4個int的指標,也即每個元素為4位元組的int,而行總位元組數為4*4=16。

解讀此類定義時先從括號內開始,解讀順序為:括號內是個指標p,其括號右側是陣列長度,表明指標p指向的是一個含有4個元素的行,字首(左側)int定義了基本資料型別,即元素型別為int,那麼行寬就是4個int組成,就是4*4位元組。

說了一大堆,那麼如果你看明白了,p=a就不用解釋了吧(賦值a的地址)。

2樓:匿名使用者

int (*p)[4]是一個定義陣列指標;

p = a;是讓這個指標指向a陣列;

記住,要想用指標訪問陣列:

一維陣列 -> 一級指標

二維陣列 -> 陣列指標

指標陣列-> 二級指標

3樓:連睿子車雨靈

p[2]是合法的,因為a本身為一維陣列,而p也是一維指標,所以這樣沒問題。p[2]相當於*(p+2),也就是a[2]。

但是q[2][3]是絕對錯誤的,因為b是一個二維陣列,而q是一維指標,所以不能這樣呼叫。另外,q=b也是錯誤的,理由同上,q=&b[0][0]就對了,你可以自己思考一下為什麼。

4樓:

定義一個指向陣列的指標 並初始化指標的值

c語言陣列與指標相關問題,謝謝

5樓:一顆程式猿

*p[1] 相當於 p[1][0], 值為4, 加上1就是5了

6樓:千鋒教育

注意操作符的優先順序,第三個*p[1]+1中最高,所以是p[1]即為34f9a8,再是*指標取內容操作符,即取出地址34f9a8的內容即為4,再+1所以得到5

C 陣列與指標,C 陣列與指標

首先看p 它是一個指向int 型別指標的指標。再看b b在除了sizeof b 的其他所有表示式中均隱式的轉換成一個指向它儲存物件型別的指標。只在表示式中才這樣的轉化 在c c 中其實是沒有多維陣列的。多維陣列都是通過一維陣列實現的。其實陣列本身也是一種物件。int b 2 2 實際上可以理解成in...

C語言陣列問題

二維陣列儲存的形式你應該知道吧,上面那個儲存成a 0 2 4 a 1 6 7 a 2 1 3 a 3 5 9 a本身是陣列的首地址,a 1中1是偏移量。在這個二維陣列裡,每行有兩個數,偏移量就自動成了8 每個int佔4個位元組,兩個就是8個 這是c語言的一種處理。a表示取a的地址裡的值,這個值還是地...

關於c語言二維陣列陣列名與指標的問題

先說些這個2維陣列 int arr 3 4 可以理解為一個3行四列的矩陣,那麼第一維arr 0 arr 1 arr 2 中存的分別是對應行的地址,也就是說arr 0 存的是一個 大小為4的整形陣列地址 這樣的話就好理解了,arr存的地址值其實與arr 0 本質上是相同的。都是這個連續空間的開始地址。...