C語言,講通過指標引用多維陣列時,講到的a 0 與 (a 0)等價怎麼理解?

時間 2021-05-13 03:40:04

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...