c語言陣列及強制轉換

2021-06-16 06:55:43 字數 1359 閱讀 6959

問題:

已分配了一指向線性或1維整形的指標,如:ptr = (int *)malloc(arrary_size)。

以後在程式中,乙個函式將把這個陣列看做100*200的2維陣列。

函式說明為:

void func(int array[200]);

如何把取自malloc的指標傳遞給這個函式,並讓所有c編譯器通過呢?這就需要強制轉換(cast)操作。

構造方式:

func((int( *)[200])foo); (注意:foo是指向由malloc分配的指標,下面不再說明了。)

這是最終的正確答案。

在這裡有個大的前提,陣列和由malloc分配的資料塊都是有一定共性的。

共性:就是都是連續的記憶體塊。(這個概念應該在我們的腦子裡有乙個前提。)

現在來看:

a[0];

a[0][0];

a[0][0][0];

*a[0]將取回與a[0][0]同樣的值。(呵呵)

這裡是不是也有乙個特性,他們的首位址都是第乙個位址,也就是陣列名,也就是所有不論n維陣列的第乙個元素都是乙個塊的開始。

(看起來簡單,但是確實乙個重要的概念。)

那麼,由malloc分配的,ptr指向的也是乙個開始位址。(呵呵。不是太嚴密,但是是這個意思)

那嗎好,這裡到此為止。我們繼續分析。

那麼為什麼要這樣構造呢?

裡面卻是有深層次的原因,讓我們來一步一步的分析。

(int( *)[200])foo;(這明顯是乙個強制轉換的操作。看起來像是1維陣列?)

int說明是整形,( *)說明是指標,[200]說明是列為200的陣列。問題來了,那麼行呢?這裡行是乙個不確定的因素。

(注意:大家都知道c語言的陣列定義是要指定陣列個數的!)那麼為什麼上面的定義只有列數而沒有行數呢?

c編譯器是如何「看見」2維陣列的呢?

陣列只是記憶體位置的連續集合,但編譯器懂得陣列成員是通過兩個索引訪問的。於是,為了引用陣列元素,編譯器需要知道陣列的維。而且,給陣列分配空間,編譯器的確要知道2個維(也包括資料型別)。但要引用陣列的一項,編譯器只需要知道陣列中有多少列。

例如:考慮一下[2][3]大小的位元組陣列。元素[i][j]偏移的計算就是i*3+j。編譯器不需要第1下標的大小。

因此,人們能夠操作無法預先知道大小的2維陣列。

在寫array[i][j]的地方,可簡單寫成*(&array[0][0] + i*cols +j);(cols代表列數,表示式&array[0][0]返回陣列首元位址)

|-------------------->( *)他是「指標」

(int( *)[200])foo

-「陣列的指標」左看-|-右看「整型陣列的指標」

回頭有時間寫個經典的。就這樣,呵呵。

c語言強制轉換

type 其中,type為型別描述符,如int,float等。為表示式。經強制型別轉換運算子運算後,返回乙個具有type型別的數值,這種強制型別轉換操作並不改變運算元本身,運算後運算元本身未改變,例如 int nvar 0xab65 char cchar char nvar 上述強制型別轉換的結果是...

c語言的強制轉換

type 其中,type為型別描述符,如int,float等。為表示式。經強制型別轉換運算子運算後,返回乙個具有type型別的數值,這種強制型別轉換操作並不改變運算元本身,運算後運算元本身未改變,例如 int nvar 0xab65 char cchar char nvar 上述強制型別轉換的結果是...

c語言強制型別轉換

例子 include輸出結果 the char is p the short is 4464 the int is 70000 the float is 70000.000000 問題 為什麼float 型別的70000 轉成char型變成了 p 首先資料型別本質是什麼?底層硬體最小的儲存單元只有開...