在《c程式設計》中看到這樣一段**講解2維陣列,看起來像是能被整理總結的東西。
#include
intmain()
;printf
("%d,%d\n"
, a,
*a);
//0行起始位址和0行0列元素位址
printf
("%d,%d\n"
, a[0]
,*(a +0)
);//0行0列元素位址
printf
("%d,%d\n"
,&a[0]
,&a[0]
[0])
;//0行起始位址和0行0列元素位址
printf
("%d,%d\n"
, a[1]
, a +1)
;//1行0列元素位址和一行起始位址
printf
("%d,%d\n"
,&a[1]
[0],
*(a+1)
+0);
//1行0列元素位址
printf
("%d,%d\n"
,a[2],
*(a+2)
);//2行0列元素位址
printf
("%d,%d\n"
,&a[2]
,a+2);
//2行起始位址
printf
("%d,%d\n"
,a[1][
0],*
(*(a+1)+
0));
//1行0列元素的值
printf
("%d,%d\n"
,*a[2]
,*(*
(a+2)+
0));
//2行0列元素的值
當我們看到題設概念,我們希望盡可能貼近我們的常識。這樣我們就可以不用記憶或者少記憶來理解這個知識。定義乙個int 型別的陣列,就是得到一段空間,其最小記憶體單元為int。稱之為資料項(資料結構中不可分割的最小單位)。我定義了乙個陣列a,它就是這段總空間的名字。它是由若干int型別的基本資料項組成。由int一層抽象(擴大)為列,二層抽象為行,三層抽象為頁等等(不是我不想繼續,是後續沒有了)我們從a開始縮小範圍。所謂縮小,即是增加精確度。第乙個方法是a[0](這種方法合乎常識,就不解釋它了),它提高了精確度。它稱之為0行0列元素位址。它從二維變成了一維。我再精確一下,變成了a[0][0],發現它已經精確到了資料項,精確到了極致。我能夠得出它的值了。所以a[0][0]稱作0行0列元素的值。這樣解釋很合理。可是還有指標符和取位址符。經過觀察可得出結論
*提高精確度
&降低精確度
我們看a=&a[0]=&(*(&a[0]))=&(&( * ( * (&a[0]))))
a[0]=*(a + 0)=&a[0][0]= *(a+0)+0=&( * ( * (&a[0])))
a[0][0]= *( * (a+0)+0 )= *(&a[0][0])= * ( * (&a[0]))= * * a= * (&( * (&( * (&( *(&a[0][0])))))))(嚇人嗎?)
註解:1.不可兩次連續抽象(&&),但可以兩次精確(**)(標紅的第二個式子報錯)
2.抽象到整體的機會只有一次(標紅的第乙個式子報錯)
有人可能要問筆者為何起始位址不畫在起始位置標個箭頭而是直接畫在圖中。是不是錯了,是不是不準確?其實不然。我們是通過什麼來記憶人像呢?是通過頭嘛,頭在一定程度上能代替整體,不存在通過角來辨識別人的吧。比如a[0],計算機說我找到了,把它的頭像呈現給您。至於他的大小你看它是啥,a[3][4]那就是4,a[3][4][5]那就是4*5=20;您給的精確度就這麼大,我也只能幫您到這裡了。抱著精確的目的,而給的這兩個註解是因為計算機希望找到最精確的點。而不是乙個大概的位置。合情合理。
C語言 取陣列首位址
我們先看下面這段 include intmain int p int arr 1 arr操作的是整個陣列,返回的指標指向整個陣列,arr 1偏移的是整個陣列的長度。printf p p n arr,arr printf p p n arr 1,arr 1 printf d d n p 1 p 1 p...
C語言陣列名取位址
面試時遇到這樣一道題,面試官在紙上寫下這樣一段 讓我說一下對應的輸出是什麼 include using namespace std int main int argc,char const argv cout a endl cout a 1 endl cout int a 1 1 endl retu...
C語言 指標陣列和指標陣列
本質是陣列 只不過呢,它裡面存放的資料型別不是int,也不是char這類基本型別,而是乙個指標型別,說白了就是位址,所以叫指標陣列!記住 是存放指標的陣列!int p n 本質是指標 只不過是指向乙個陣列的指標,也稱之為 行指標 int p n p是乙個指標,指向乙個int型別的一位陣列,這個一位陣...