c/c++那些你一定會(huì)出錯(cuò)的數(shù)組筆試題匯總
前言:
數(shù)組是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)類型,我們?cè)试S數(shù)組中可以放置很多相同數(shù)據(jù)類型的元素,不管是在日常的開發(fā),編程,面試中,都有極為廣泛的應(yīng)用,今天,筆者就給大家?guī)硪幌盗锌此坪唵?,但是做起來卻有不少陷阱和困難的數(shù)組面試題,相信您看完本篇文章一定會(huì)有不小的收獲
一.一維整形數(shù)組
在進(jìn)行題目的聯(lián)系講解之前,我們要對(duì)以下知識(shí)點(diǎn)有一個(gè)基礎(chǔ)的認(rèn)知:
數(shù)組名的理解:數(shù)組名是數(shù)組首元素的地址
但是有2個(gè)例外:
- sizeof(數(shù)組名),這里的數(shù)組名表示整個(gè)數(shù)組,sizeof(數(shù)組名)計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)
- &數(shù)組名,這里的數(shù)組名表示整個(gè)數(shù)組,&數(shù)組名取出的是數(shù)組的地址
首先,我們定義一個(gè)數(shù)組,里面一共有 4 個(gè)整形元素,接下來的一維數(shù)組的所有題目都是基于此討論會(huì)有怎么樣的輸出(以32位機(jī)器為例)
//一維數(shù)組 int a[] = { 1,2,3,4 }; //4個(gè)元素,每個(gè)元素使int類型(4個(gè)字節(jié))
題目一:
printf("%d\n", sizeof(a));
輸出結(jié)果:16
數(shù)組名 a 單獨(dú)放在sizeof內(nèi)部,數(shù)組名表示整個(gè)數(shù)組,計(jì)算的是整個(gè)數(shù)組的大小單位是字節(jié),是 16 字節(jié)
題目二:
printf("%d\n", sizeof(a + 0));
輸出結(jié)果:4
a 并非單獨(dú)放在sizeof內(nèi)部,也沒有 &,所以數(shù)組名a是數(shù)組首元素的地址,a+0還是首元素的地址,是地址大小就是 4/8 Byte
題目三:
printf("%d\n", sizeof(*a));
輸出結(jié)果:4
a 并非單獨(dú)放在 sizeof 內(nèi)部,也沒有 &,所以數(shù)組名 a 是數(shù)組首元素的地址,*a 就是首元素,大小就是 4 Byte ,*a == *(a+0) == a[0]
題目四:
printf("%d\n", sizeof(a + 1));
輸出結(jié)果:4
a 并非單獨(dú)放在 sizeof 內(nèi)部,也沒有 &,所以數(shù)組名 a 是數(shù)組首元素的地址,a+1 就是第二個(gè)元素的地址,a+1 == &a[1] ,是第2個(gè)元素的地址,是地址就是 4/8 個(gè)字節(jié)
題目五:
printf("%d\n", sizeof(a[1]));
輸出結(jié)果:4
a[1] 就是數(shù)組的第二個(gè)元素,這里計(jì)算的就是第二個(gè)元素的大小,單位是字節(jié)
題目六:
printf("%d\n", sizeof(&a));
輸出結(jié)果:4
&a - 是取出數(shù)組的地址,但是數(shù)組的地址也是地址,是地址就是4/8個(gè)Byte,數(shù)組的地址 和 數(shù)組首元素的地址 的本質(zhì)區(qū)別是類型的區(qū)別,并非大小的區(qū)別
題目七:
printf("%d\n", sizeof(*&a));
輸出結(jié)果:16
對(duì)數(shù)組指針解引用訪問一個(gè)數(shù)組的大小,單位是字節(jié),sizeof(*&a) --- sizeof(a)
題目八:
printf("%d\n", sizeof(&a + 1));
輸出結(jié)果:4
&a 數(shù)組的地址,&a+1 還是地址,是地址就是 4/8 個(gè)字節(jié)
題目九:
printf("%d\n", sizeof(&a[0]));
輸出結(jié)果:4
&a[0] 是首元素的地址, 計(jì)算的是地址的大小 4/8 個(gè)字節(jié)
題目十:
printf("%d\n", sizeof(&a[0] + 1));
輸出結(jié)果:4
&a[0] 是首元素的地址,&a[0]+1 就是第二個(gè)元素的地址,大小 4/8 個(gè)字節(jié)
二.一維字符數(shù)組
首先,我們定義一個(gè)字符型數(shù)組,接下來的數(shù)組的所有題目都是基于此討論會(huì)有怎么樣的輸出(以32位機(jī)器為例)
//字符數(shù)組 char arr[] = { 'a','b','c','d','e','f' };//6 個(gè)元素
題目一:
printf("%d\n", sizeof(arr));
輸出結(jié)果:6
數(shù)組名 arr 單獨(dú)放在 sizeof 內(nèi)部,計(jì)算的是整個(gè)數(shù)組的大小,單位是字節(jié)
題目二:
printf("%d\n", sizeof(arr + 0));
輸出結(jié)果:4
arr 是首元素的地址==&arr[0],是地址就是 4/8 個(gè)字節(jié)
題目三:
printf("%d\n", sizeof(*arr));
輸出結(jié)果:1
arr是首元素的地址,*arr就是首元素,大小就是1Byte
題目四:
printf("%d\n", sizeof(arr[1]));
輸出結(jié)果:1
訪問數(shù)組第一個(gè)元素大小,為char類型
題目五:
printf("%d\n", sizeof(&arr));
輸出結(jié)果:4
&arr是數(shù)組的地址,sizeof(&arr)就是 4/8 個(gè)字節(jié)
題目六:
printf("%d\n", sizeof(&arr + 1));
輸出結(jié)果:4
&arr+1 是跳過數(shù)組后的地址,是地址就是 4/8 個(gè)字節(jié)
題目七:
printf("%d\n", sizeof(&arr[0] + 1));
輸出結(jié)果:4
第二個(gè)元素的地址,是地址就是 4/8 Byte
三.二維數(shù)組
我們初始化二維數(shù)組如下,接下來的數(shù)組的所有題目都是基于此討論會(huì)有怎么樣的輸出(以32位機(jī)器為例)
int a[3][4] = { 0 };
題目一:
printf("%zd\n", sizeof(a));
輸出結(jié)果:48
數(shù)組名 a 單獨(dú)放在了 sizeof 內(nèi)存,表示整個(gè)數(shù)組,sizeof(a) 計(jì)算的是數(shù)組的大小,單位是字節(jié)
題目二:
printf("%zd\n", sizeof(a[0][0]));
輸出結(jié)果:4
a[0][0] 是數(shù)組的第一行第一個(gè)元素,這里計(jì)算的就是一個(gè)元素的大小,單位是字節(jié)
題目三:
printf("%zd\n", sizeof(a[0]));
輸出結(jié)果:16
a[0] 是第一行這個(gè)一維數(shù)組的數(shù)組名,數(shù)組名單獨(dú)放在了 sizeof 內(nèi)部,sizeof(a[0]) 計(jì)算的整個(gè)第一行這個(gè)一維數(shù)組的大小
題目四:
printf("%zd\n", sizeof(a[0] + 1));
輸出結(jié)果:4
a[0] 并非單獨(dú)放在 sizeof 內(nèi)部,也沒有 &,所以 a[0] 表示第一行這個(gè)一維數(shù)組首元素的地址,也就是第一行第一個(gè)元素的地址
a[0] <---> &a[0][0]
a[0]+1 ---> &a[0][1]
題目五:
printf("%zd\n", sizeof(*(a[0] + 1)));
輸出結(jié)果:4
a[0] + 1是第一行第二個(gè)元素的地址,*(a[0] + 1))就是第一行第二個(gè)元素
題目六:
printf("%zd\n", sizeof(a + 1));
輸出結(jié)果:4
a 作為二維數(shù)組的數(shù)組名,并沒有單獨(dú)放在 sizeof 內(nèi)部,也沒有 &,a 就是數(shù)組首元素的地址,也就是第一行的地址, a 的類型是 int(*)[4],a+1 就是第二行的地址,類型是:int(*)[4]
題目七:
printf("%zd\n", sizeof(*(a + 1)));
輸出結(jié)果:16
a+1是第二行的地址,*(a+1)就是第二行,計(jì)算的就是第二行的大小
另外一個(gè)角度理解:*(a+1) -- a[1],sizeof(a[1]) - a[1] 這個(gè)第二行的數(shù)組名,單獨(dú)放在了 sizeof 內(nèi)部,計(jì)算的是第二行的大小
題目八:
printf("%zd\n", sizeof(&a[0] + 1));
輸出結(jié)果:4
a[0] 是第一行的數(shù)組名,&a[0] 取出的是數(shù)組的地址,取出的是第一行這個(gè)一維數(shù)組的地址,類型就是 int(*)[4] ,&a[0]+1 就是第二行的地址,類型就是 int(*)[4]
題目九:
printf("%zd\n", sizeof(*(&a[0] + 1)));
輸出結(jié)果:16
*(&a[0] + 1) 得到的就是第二行,計(jì)算的就是第二行的大小
題目十:
printf("%zd\n", sizeof(*a));
輸出結(jié)果:16
a 表示數(shù)組首元素的地址,也就是第一行的地址,*a 就是第一行,也就相當(dāng)于是第一行的數(shù)組名,*a--> *(a+0) -- a[0]
題目十一:
printf("%zd\n", sizeof(a[3]));
輸出結(jié)果:16
輸出結(jié)果不會(huì)越界,還是作為一行的結(jié)果進(jìn)行輸出,代表一行的大小,所以是 16
總結(jié)
到此這篇關(guān)于c/c++那些你一定會(huì)出錯(cuò)的數(shù)組筆試題的文章就介紹到這了,更多相關(guān)c/c++數(shù)組筆試題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++ Boost實(shí)現(xiàn)異步端口掃描器詳解
端口掃描是一種用于識(shí)別目標(biāo)系統(tǒng)上哪些網(wǎng)絡(luò)端口處于開放、關(guān)閉或監(jiān)聽狀態(tài)的網(wǎng)絡(luò)活動(dòng),本文將運(yùn)用Boost框架實(shí)現(xiàn)一個(gè)基于TCP的掃描工具,有需要的小伙伴可以參考下2023-11-11C++如何計(jì)算結(jié)構(gòu)體與對(duì)象的大小
這篇文章主要給大家介紹了關(guān)于C++如何計(jì)算結(jié)構(gòu)體與對(duì)象大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05C語言連接并操作Sedna XML數(shù)據(jù)庫的方法
這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫的方法,實(shí)例分析了C語言操作XML文件的相關(guān)技巧,需要的朋友可以參考下2015-06-06C語言判斷一個(gè)數(shù)是否為素?cái)?shù)方法解析
這篇文章主要介紹了C語言判斷一個(gè)數(shù)是否為素?cái)?shù)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07