在指向行的指標前面加乙個 就轉換為指向列的指標,為什麼啊?

時間 2021-07-03 08:14:55

1樓:心裡藏著小怪獸

其實不需要理會行和列的說法,反正說到行和列我也懵逼,以下以三維陣列為例以我的角度來理解下這個問題,可能有點答不對題。

陣列宣告如下(假定是int的儲存大小為4個位元組):

int arr[10][8][3]

1. 首先無論是幾維陣列,其都代表一段連續的記憶體,只不過為了能夠描述一些問題強制分了維度。比如我上面定義的陣列,其中最低維即第三維大小是3,代表乙個三維座標中需要xyz三個座標值確定乙個點,第二維8代表乙個長方體的8個頂點,第一維代表10個長方體。

這10個長方體的頂點資料是放在一塊連續的 3 * 8 * 10個int大小的記憶體之內。

2. 指標型別的作用有兩個:加*(有的地方叫解引用)能夠取到的值的型別;進行加減運算的步長,比如int* 的步長就是乙個int的儲存的大小,即 (int*)1 + 1 = 5。

3. 陣列的名字其實上是乙個連續記憶體的位址,規定其步長按照除最高維計算。比如上面陣列,如果直接用arr進行加減計算,其運算的步長是8 * 3 個int大小。

簡單地,可以模擬一維陣列,步長就是陣列元素的大小。

4. 對於陣列的指標加*其實就是降維,arr本身是三維步長是8 * 3 * 4(4 代表int儲存空間的大小), 相當與乙個長方體的資料大小, *arr的步長是3 * 4,乙個頂點的資料大小

5. 指標有兩個屬性,型別和值,值表示其記憶體的位址。

6. 最後實際來理解下對於資料指標的各種操作的結果,一定要把握住計算得到的值的物理意義,真正用的時候行呀,列呀都沒意義:

因為陣列名arr代表的其實是陣列的記憶體起始位址,假定其值為1000;

(A) arr

步長為8 * 3 * 4,加一將跨過乙個長方體的資料大小。

(B) arr + 1

位址跨過乙個長方體的資料大小,所以得到的結果是第二個長方體的起始位址。

(C) *(arr + 1) 等價於 arr[1

在上一步的基礎上降維,步長為 3 * 4,加一將跨過乙個頂點的大小,

(D) *(arr + 1) + 1 等價於 arr[1] + 1

(E) *(*(arr + 1) + 1) + 1 等價於 arr[1][1] + 1

(F) *(*(*(arr + 1) + 1) + 1) arr[1][1][1]

取得第二個長方體的第二個定點的y座標

2樓:紅糖Hometown

這裡意思不是加了*指向整個二維陣列的哪一列,是某一行的第幾列,也就是這行的第幾個元素。這裡他說的是指向第0列,是指向位址,如果得到具體的值外層還需要套乙個*。

*(a+1)=*(a+1)+0,這個是第二行第一列的位址。

C 指標「指向緊鄰物件所佔空間的下乙個位置」是什麼意思?

張擘 作者寫這幾種情況表示的是指標在生命週期內,所有可能的狀態,它的值會是哪些,就這麼簡單。eg int int 那麼這個指標 解引用 就是 就是指向緊鄰物件所佔空間的下乙個位置,但是他解引用會是什麼呢,不確定的。 李小明 尾後迭代器那種.就比如int ia 100 取乙個陣列的最後元素的後乙個指標...

為什麼有人說話的時候前面喜歡加乙個不是?

題主的問題我真的想問很久了 男朋友的乙個朋友總來我家玩,總見面不說話也太尷尬,但是說話真的太累,當你開口跟他說話或者隨便說個話茬 他就接 不是,關鍵是啥,關鍵是什麼什麼什麼什麼,關鍵在於什麼什麼,而且你想吧什麼什麼什麼。只要別人開始表達自己的看法,他就開始這樣子,並且把 不是 這兩個詞當口頭禪。別人...

有乙個在投行工作的男朋友是一種怎樣的體驗?

揀泥 投行男友不知道,但印度男友的七大姑八大姨小叔小舅子基本佔據了華爾街投行高管層的半壁江山。總體就是在掙錢和生活中取捨,生孩子之後要做出妥協。整體是個充滿人精的服務行業,相比單幹,與 la 人 bang 為 Jie 善 pai 合作共贏,方能長久。 兔阿娜阿娜 我幹投行時候的男友不是投行的但是我們...