c 面試題之陣列與指標

2021-06-06 09:10:27 字數 2319 閱讀 6997

關於陣列與指標的問題,常見的有,指向陣列的指標,宣告陣列指標和指標陣列等,在這裡主要看看指向陣列的指標是怎麼回事。

指向陣列的指標,總的來說,實際上可以歸納為如下幾點:

1、 有乙個一維陣列int a1[10],定義乙個指標,指向一維陣列名。

2、 有乙個一維陣列int a2[10],定義乙個指標,指向一維陣列名的位址。

3、 有乙個二維陣列int a3[3][4],定義乙個指標,指向二維陣列名。

4、 有乙個二維陣列int a4[3][4],定義乙個指標,指向二維陣列名的位址。

這四個問題,都是讓我們定義乙個指標,指向一片連續的記憶體空間,只是說這片記憶體空間有的是一維,有的是二維而已。

我們這次先分析下前面兩道題:

那我們先看第乙個題目,因為a1本身就是連續空間的首位址,那麼我們就只需要定義乙個位址變數p,讓p = a就可以了,既然要用「=」,那麼等號兩邊就需要的型別一樣,所以毫無疑問,p應該為 《資料型別》 *p了。現在不確定的就是資料型別了。根據指標的定義,應該有p[0]到p[1]的偏移和a[0]到a[1]的偏移一致,我們很容易看出,a[0]和a[1]的偏移是int型別。那麼對於第乙個題目的資料型別就應該為int了,第一題的答案為int *p;

接著看第二問題,這個問題的難點在,什麼叫陣列名的位址,我們都知道c語言中的變數都有位址,但陣列名是什麼,他是不是也在記憶體中實實在在的存在哪,回答是否定的(感興趣的同學,可以試著證明下,a的值和&a的值有什麼特點)。a是陣列空間的乙個標號,那對標號取位址,是什麼那,我們可以試著把&a和&a+1的位址都列印出來,然後看下他們的關係,我們會發現,&a和&a+1之間的偏移實際上是10個int的單位。那麼我們也可以推出陣列名的位址原來標示了整個陣列的空間。也就是說&a[0]和&a[1]的偏移實際上是乙個int [10]的空間。那麼對於《資料型別》 *p來說,資料型別就是指int [10]這個空間了。第二題的答案為int (*p)[10];

對於前2個問題,可以寫出如下實驗**:

int main(int argc,char *argv)

以上程式中p1,p即我們應該填的,如果編譯器編譯時沒有警告,那麼說明我們的這樣寫法是正確的。

那麼在深入下的分析下,p1和p現在都要他訪問a1中的第二個元素,即a1[1],應該怎麼做那?

大家可以思考下,答案是:p[1] p1[0][1],如何驗證那,只要執行if(p[1] = = p1[0][1]),如果這個邏輯為真,那說明正確。

上次題目的內容為:

1、 有乙個一維陣列int a1[10],定義乙個指標,指向一維陣列名。

2、 有乙個一維陣列int a2[10],定義乙個指標,指向一維陣列名的位址。

3、 有乙個二維陣列int a3[3][4],定義乙個指標,指向二維陣列名。

4、 有乙個二維陣列int a4[3][4],定義乙個指標,指向二維陣列名的位址。

還記得前2道題的分析方法嗎,第乙個題,應該定義乙個int *p的指標來指向一維陣列a1(這個是比較簡單的)。而第二個題目為定義int (*p)[10]來指向一維陣列a2的位址。

我們分析後面面兩道題:

int a3[3][4]為二維陣列,大家都知道他的物理意義是3行4列,但是我們都知道,計算機的記憶體是一維空間,即不可能按照乙個面的方式儲存二維陣列的,那麼計算機怎麼儲存呢,大家可以參考下c語言教材,二維陣列是按照從上到下從左到右的順序放置到一維記憶體空間的。

比如int a3[3][4] = ,},在計算機分配了8個int空間按順序儲存1,2,3,4,5,6,7,8,那計算機怎麼知道1,2,3,4為第一行那,而不是1,2為一行,3,4為一行那。看來a3中的「[4]」起到了很重要的作用。

那麼我們還是回到題目上,定義乙個指標指向a3,那麼我們就先看下a3是怎麼讀記憶體的?a3 和a3+1,我們分別用%p來檢視下他們的位址偏移,程式大家可以自己寫,我們會發現他們兩者的差值為16,我們又知道a3裡面存著都是4個位元組的int型別,那麼可以知道,從a3到a3+1偏移了4個int單位,而這個4恰好是第二個方括號的數字。

那麼我們定義的指標p偏移記憶體的方式也應該是4個int單位才能和a3匹配,所以很多同學在面試時給出int **p的結果是不對的,因為二維指標的偏移還是4個位元組為乙個偏移單位,跟我們分析的不一樣。那我們如果去寫乙個指向4個int單位的指標那,大家可以考慮下使用小括號來幫助我們理解。

答案為:int (*p)[4]。看到這個答案,和我們的第二題的答案很類似,所以我們可以這樣認為,一維陣列名的位址實質就是乙個二維陣列的一行。

下面我們看第四題,有涉及到陣列名的位址的問題,二維陣列名的位址,根據我們上次分析,可以知道,二維陣列名的位址偏移實際上是乙個二維陣列物件,即偏移乙個面,那麼對於指標的定義,應該容易的得到:

int (*p)[3][4];

這樣的答案。

綜合這幾道題目,我們能更深入的理解關於指標的含義了。

C 面試題 之指標與引用(2)

includeusing namespace std void getmemory char p,int num int main 解析 毛病出在函式getmemory中,編譯器總是要為函式的每個引數製作臨時副本,在本例中,void getmemory char p int num 中的 p實際上是...

面試題目之指標

題目一 請分析下面 的結果。include include includeint main 解答 輸出為空。上題的本意是將字串 china 複製到p2所指向的記憶體區域,然後列印p2所指向的字串。但是結果是什麼也沒有複製,是因為p1和p2同時自增,當複製完p1的字串的時候,p2也指向了 china ...

C 面試題之i 面試題

i 面試題1.cpp 中國台灣某著名防毒軟體公司2005年10月面試題 int i 3,j 4 i?i j printf d d n i,j a.3 3 b.4 4 c.3 4 d.4 3 答案b i 面試題2.cpp 中國某著名計算機金融軟公司2005年面試題 int x 1,j 2 int k ...