c/c++那些你一定會(huì)出錯(cuò)的數(shù)組筆試題匯總
前言:
數(shù)組是一種基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)類型,我們允許數(shù)組中可以放置很多相同數(shù)據(jù)類型的元素,不管是在日常的開發(fā),編程,面試中,都有極為廣泛的應(yīng)用,今天,筆者就給大家?guī)硪幌盗锌此坪唵?,但是做起來卻有不少陷阱和困難的數(shù)組面試題,相信您看完本篇文章一定會(huì)有不小的收獲
一.一維整形數(shù)組
在進(jìn)行題目的聯(lián)系講解之前,我們要對以下知識點(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
對數(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測
這篇文章主要為大家詳細(xì)介紹了Opencv Hough算法實(shí)現(xiàn)圖片中直線檢測,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
CString,字符串,整數(shù)等相互轉(zhuǎn)換方法(推薦)
下面小編就為大家?guī)硪黄狢String,字符串,整數(shù)等相互轉(zhuǎn)換方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09
C++線性表深度解析之動(dòng)態(tài)數(shù)組與單鏈表和棧及隊(duì)列的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)數(shù)組、單鏈表、棧、隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
VC6.0如何創(chuàng)建以及調(diào)用動(dòng)態(tài)鏈接庫實(shí)例詳解
作為客戶與后臺的中介,為了更好的調(diào)節(jié)兩方的關(guān)系,我明智滴選擇了webservice以及動(dòng)態(tài)鏈接庫。在與客戶c++使動(dòng)態(tài)鏈接庫方式,而與后臺java,使用webservice來交流溝通2013-01-01
C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之線索二叉樹及其遍歷的相關(guān)資料,為了加快查找節(jié)點(diǎn)的前驅(qū)和后繼。對二叉樹的線索化就是對二叉樹進(jìn)行一次遍歷,在遍歷的過程中檢測節(jié)點(diǎn)的左右指針是否為空,如果是空,則將他們改為指向前驅(qū)和后繼節(jié)點(diǎn)的線索,需要的朋友可以參考下2017-08-08
C/C++實(shí)現(xiàn)監(jiān)控目錄文件變化
ReadDirectoryChangesW是Windows操作系統(tǒng)提供的一個(gè)函數(shù),用于監(jiān)視目錄的變化,本文主要為大家介紹了如何使用ReadDirectoryChangesW實(shí)現(xiàn)監(jiān)控目錄文件變化,需要的可以參考下2023-11-11
C++中Semaphore內(nèi)核對象用法實(shí)例
這篇文章主要介紹了C++中Semaphore內(nèi)核對象用法實(shí)例,有助于深入了解信號量(Semaphore)的基本用法,需要的朋友可以參考下2014-10-10

