c語言中「指標」是算是比較難的乙個問題,而「指標」就是「位址」,知道陣列的位址問題,才能在用指標陣列的時候得心應手。
下面是一段**
#include
int main()
; int b[2][3] = ;
printf ("%p\t%p\n", &a, &a + 1);
printf ("%p\t%p\n", a, a + 1);
printf ("%p\t%p\n", &a[0], &a[0] + 1);
printf ("%p\t%p\n", a[0], a[0] + 1);
printf ("%p\t%p\n", &b, &b + 1);
printf ("%p\t%p\n", b, b + 1);
printf ("%p\t%p\n", &b[0], &b[0] + 1);
printf ("%p\t%p\n", b[0], b[0] + 1);
printf ("%p\t%p\n", &b[0][0], &b[0][0] + 1);
printf ("%p\t%p\n", b[0][0], b[0][0] + 1);
return
0;}
在這段**裡我定義了乙個 一維陣列 a[3] ,乙個二維陣列 a[2][3];
如果 a 是陣列名,也代表陣列 a 的首位址,指向陣列的第乙個元素, 那麼 a + 1代表什麼呢? 在這裡記住一句話「陣列名不加取址符(&)時,往下降一級使用」。
什麼叫降一級?
一維陣列 a 往下降一級就是 陣列元素,那麼 a + 1 的位址就等於 a 的位址加4,因為乙個元素四個位元組;
a [0]是陣列a第乙個元素的名字,也就是 「陣列名」,元素降一級就是位元組,我們不加&的時候,a[0] + 1 的位址就是 a [0]的位址加1;
再來看看二維陣列:
二維陣列 b ,加&時,&b也是代表陣列首位址,但是 &b + 1 就等於 &b 的位址加上整個陣列的位元組數,跨過了整個陣列,在這裡陣列位元組數等於4*2*3=24;
b不加&時呢,往下降一級,二維陣列降一級就到了 「行」,也就是說 b位址 相當於 &b[0] 位址,那麼b + 1就是要加上一行的位元組數8,在這裡b[2][3]一行有兩個元素,即8個位元組;
那行再降一級呢?就到了元素,a[0] 是陣列行名,並且沒有加&號,那麼它就降一級,到了元素,即 a[0] 位址等於 &a[0][0] 位址,所以 a[0] + 1 等於 a[0] 位址加 4;
那元素再降一級呢?又到了位元組,就跟上面的一維陣列一樣啦,a[0][0]不加&,那麼 a[0][0] + 1 位址就是 a [0][0] 加 1,因為是乙個位元組;
執行結果:
a44 - a38 等於十進位制 12
3c - 38 等於十進位制 4
… … 依次算下來驗證了上面說法的正確性。
關於陣列位址,指標
1.以下三條輸出語句分別輸出什麼?char str1 abc char str2 abc const char str3 abc const char str4 abc const char str5 abc const char str6 abc cout boolalpha str1 str2 ...
關於視訊記憶體位址問題
為什麼有些書說視訊記憶體首位址為a00000,有的說再b8000?顯示模式不同。我記得b800是單色 a000是彩色 圖形?我想你是在dos下編寫吧 不同的顯示模式首位址不一樣 a000000l通常是0x13 b8000那是文字模式 如果是dos下編,注意以下幾點 1。所有圖形方式中顯示緩衝區起始位...
關於將陣列位址賦給指標的問題
對於int p 3 這條語句宣告了 p是乙個指向乙個包含3個int值的陣列的指標。如下面對p賦值的例子 include include include intmain int p 3 p a printf d d d p,p 1 p 2 這段程式的結果 1 2 3 又比如 include inclu...