1樓:
位址偏移有什麼難以理解的其實還有0 [a] ==a[0]==*(a+0) 奇怪的0[a]好像是在 c與指標的書裡有詳細說過
2樓:
a如果是個陣列的話,單獨使用a這個識別符號代表a的首位址。。。
然後如果是a[0]這樣的寫法,代表引用a陣列的下標為0的元素,也就是取a陣列第乙個元素的值。這個下標為0的元素的位址實際上跟整個陣列a的首位址是同乙個位址。。。
(a+0)這樣的寫法實際是對位址進行運算,即把位址a加上乙個數得到乙個新位址,但是由於它加的是0,所以得到的新位址實際並沒有改變,然後括號外面的*是用來取指標或位址指向的儲存單元的內容的,在你的例子裡就是取陣列a的首位址加0之後的位址,也就是還是首位址的儲存單元的內容。。。
前面講過了,下標為0的元素的位址實際上跟整個陣列a的首位址是同乙個位址。。。
所以,a[0]的寫法與*(a+0)的寫法是等價的。。。
3樓:VizXu
首先要理解乙個概念叫位址偏移!
位址模型0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111以上分乙個小格仔代表乙個byte,總共16byte。
定義以下陣列:
char c[16];
int i[4];
int ii[2][2]
struct _s
; //這裡記憶體對齊,總共8byte
struct _s s[2];
分析:&c[0] ----> 指向0000
&c[1] == (c + 1) ----> 指向0001,就是說往後偏移了乙個byte,因為乙個char佔據乙個byte
&i[0] ----> 指向0000
&i[1] == (i + 1) ----> 指向0004,就是說往後偏移了四個byte,因為乙個int佔據四個byte
ii有點特別,因為是乙個二維陣列,但是事實上我們可以認為它是乙個一維陣列的一維陣列。怎麼理解呢?
我們可以認為
ii[0]整體上是乙個陣列,ii[1]整體上又是另外乙個陣列,所以:
ii[0] == &ii[0][0], 同理 ii[1] == &ii[1][0]
ii和ii[0]雖然指向的位址值一樣,但是ii是乙個二維位址,而ii[0]是乙個一維位址,所以它們是不等價的。
因此,ii的位址偏移是以兩個byte作單位,而ii[0]或者ii[1]是以乙個byte作偏移單位的。
s是乙個結構體陣列,這裡位元組對齊會導致s佔據8個byte,所以:
s[0] ----> 指向0000
s[1] ----> 指向1000,偏移8byte
&s[0].ch ----> 指向0000
&s[0].i ----> 指向0100, 偏移4byte
不知道這樣講解是不是可以讓你容易明白?!
4樓:江夏彧
在二維陣列在記憶體中,也是用線性的方式存放,假設是三條紙條。a [3] [3]。但是a[0]到a[2]是第一條,第一條的末尾連線著第二條紙條的頭。就是這樣理解。
5樓:jxy
a[0]是&a[0][0],那為什麼*(a+0)會是乙個指標呢?a不是&a[0][0]嗎?那*a不應該是乙個指標所指向的位址裡面的值嗎?
C 語言中指標陣列和陣列指標 函式指標 指向函式的指標等等該怎麼理解?
ga6840 direct declarator IDENTIFIER declarator direct declarator direct declarator assignment expr direct declarator declarator direct declarator poin...
C語言中多維陣列是否慢於一維陣列?
土地測量員 對於在全域性或者棧上分配的多維陣列 也就是位址是連續的 都可以看成是一維陣列模擬出來的,要訪問某個元素肯定存在著計算偏移量的過程,不過是交給編譯器幫你來完成這個過程了 其實可以看成語法糖的樣子?所以它比起一維是要慢一點。不過很多時候,某些東西從邏輯上來講就是多維的,你用一維的思路無法解決...
C語言裡如何按需生成函式指標陣列?
暮無井見鈴 C 怎麼生成 4096 個函式?參考這裡的巨集,編譯時生成這些函式是可行的。C 的話用 index sequence 模板就行。 VeroFess 手機回答 我是這麼做的 shellcode 彙編引擎 mmap VirtulAlloc 是不太安全 我乙個寫殼的管他安不安全 gcc下 in...