陣列指標的記憶體布局及例項

2022-02-06 04:48:02 字數 1313 閱讀 8045

首先測試源**如下:

#include int main(void)

>gcc -wall p3add1.c

p3add1.c: in function 'main':

p3add1.c:6:18: warning: initialization from incompatible pointer type [enabled b

y default]

./a.exe

p3 = 0x22ff43

p4 = 0x22ff43

p3+1 = 0x22ff48

p4+1 = 0x22ff49

printf語句最好寫成printf("p3 = 0x%x\n",(unsigned int)p3);否則用gcc -wall 選項編譯的時候會出現下面的警告:

p3add1.c:12:2: warning: format '%x' expects argument of type 'unsigned int', but

argument 2 has type 'char (*)[3]' [-wformat]

至於initialization from incompatible pointer type [enabled by default]這個警告,我也找不到解決方法,不知哪位高手可以提醒一下~謝謝!

首先來看看p3是如何定義的.知道p3了,p4也就不難了:

(*p3)[5]的有了(),()的優先順序比高,「*」號和 p3構成乙個指標的定義,指標變數名為 p3,int 修飾的是陣列的內容,即陣列的每個元素。陣列在這裡並沒有名字,是個匿名陣列。那現在我們清楚 p3 是乙個指標,它指向乙個包含5個int型別資料的陣列,即陣列指標。

而&a的意思是取整個陣列的位址,a的意思就是取陣列首元素的位址。

char (*p3)[5] = &a;

char (*p4)[6] = a;

這兩個語句的意思就是:

把整個陣列的位址賦值給p3

把&a[0]的值賦給p4。

然後p3+1和p4+1後就是在p3和p4位址的基礎上再加上相應的n個單位的偏移量(p3的n=5,p4的n=6),就得到了上述的結果.

其實,陣列a的大小並不重要,只要是個有效的陣列即可。

char (*p3)[5] = &a;

char (*p4)[6] = a;

這兩個操作僅僅是把兩個位址賦給兩個指標變數。

還有

(unsigned int)(p3+1)
後面的括號一定要加,不然就是unsigned int的資料加數字1了,而不是加乙個陣列單位了!

陣列 指標及記憶體

一 記憶體四區 a 區。存放 b 全域性區。全域性的常量 字串常量和變數 c 棧區。系統自動開闢,系統自動釋放,並不是很大。比如for迴圈中的int i 0。d 堆區。動態開闢的記憶體,手動開闢,手動釋放。大。比如自己定義的資料結構 a 編號連續 b 唯一的 c 取位址運算子 單目運算子,優先順序很...

陣列指標 指標陣列 位址的強制轉換記憶體布局

1 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。2 陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下面到底哪個是陣列指標,哪個是...

陣列指標 指標陣列 位址的強制轉換記憶體布局

1 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。2 陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣列的指標 的簡稱。下面到底哪個是陣列指標,哪個是...