buzhidaozenmeshuo
- 前因
- 經過
- 后果
- 說明
- 暢想
前因
在《C程式設計》中看到這樣一段代碼講解2維陣列,看起來像是能被整理總結的東西,
#include<stdio.h>
int main()
{
int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };
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列元素的值
return 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;您給的精確度就這么大,我也只能幫您到這里了,抱著精確的目的,而給的這兩個注解是因為計算機希望找到最精確的點,而不是一個大概的位置,合情合理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/95895.html
標籤:其他
上一篇:鴻蒙內核開發概述
下一篇:數與極限
