c/c++那些你一定會出錯的數(shù)組筆試題匯總
前言:
數(shù)組是一種基礎的數(shù)據(jù)結(jié)構(gòu)類型,我們允許數(shù)組中可以放置很多相同數(shù)據(jù)類型的元素,不管是在日常的開發(fā),編程,面試中,都有極為廣泛的應用,今天,筆者就給大家?guī)硪幌盗锌此坪唵危亲銎饋韰s有不少陷阱和困難的數(shù)組面試題,相信您看完本篇文章一定會有不小的收獲
一.一維整形數(shù)組
在進行題目的聯(lián)系講解之前,我們要對以下知識點有一個基礎的認知:
數(shù)組名的理解:數(shù)組名是數(shù)組首元素的地址
但是有2個例外:
- sizeof(數(shù)組名),這里的數(shù)組名表示整個數(shù)組,sizeof(數(shù)組名)計算的是整個數(shù)組的大小,單位是字節(jié)
- &數(shù)組名,這里的數(shù)組名表示整個數(shù)組,&數(shù)組名取出的是數(shù)組的地址
首先,我們定義一個數(shù)組,里面一共有 4 個整形元素,接下來的一維數(shù)組的所有題目都是基于此討論會有怎么樣的輸出(以32位機器為例)
//一維數(shù)組 int a[] = { 1,2,3,4 }; //4個元素,每個元素使int類型(4個字節(jié))
題目一:
printf("%d\n", sizeof(a));
輸出結(jié)果:16
數(shù)組名 a 單獨放在sizeof內(nèi)部,數(shù)組名表示整個數(shù)組,計算的是整個數(shù)組的大小單位是字節(jié),是 16 字節(jié)
題目二:
printf("%d\n", sizeof(a + 0));
輸出結(jié)果:4
a 并非單獨放在sizeof內(nèi)部,也沒有 &,所以數(shù)組名a是數(shù)組首元素的地址,a+0還是首元素的地址,是地址大小就是 4/8 Byte
題目三:
printf("%d\n", sizeof(*a));
輸出結(jié)果:4
a 并非單獨放在 sizeof 內(nèi)部,也沒有 &,所以數(shù)組名 a 是數(shù)組首元素的地址,*a 就是首元素,大小就是 4 Byte ,*a == *(a+0) == a[0]
題目四:
printf("%d\n", sizeof(a + 1));
輸出結(jié)果:4
a 并非單獨放在 sizeof 內(nèi)部,也沒有 &,所以數(shù)組名 a 是數(shù)組首元素的地址,a+1 就是第二個元素的地址,a+1 == &a[1] ,是第2個元素的地址,是地址就是 4/8 個字節(jié)
題目五:
printf("%d\n", sizeof(a[1]));
輸出結(jié)果:4
a[1] 就是數(shù)組的第二個元素,這里計算的就是第二個元素的大小,單位是字節(jié)
題目六:
printf("%d\n", sizeof(&a));
輸出結(jié)果:4
&a - 是取出數(shù)組的地址,但是數(shù)組的地址也是地址,是地址就是4/8個Byte,數(shù)組的地址 和 數(shù)組首元素的地址 的本質(zhì)區(qū)別是類型的區(qū)別,并非大小的區(qū)別
題目七:
printf("%d\n", sizeof(*&a));
輸出結(jié)果:16
對數(shù)組指針解引用訪問一個數(shù)組的大小,單位是字節(jié),sizeof(*&a) --- sizeof(a)
題目八:
printf("%d\n", sizeof(&a + 1));
輸出結(jié)果:4
&a 數(shù)組的地址,&a+1 還是地址,是地址就是 4/8 個字節(jié)
題目九:
printf("%d\n", sizeof(&a[0]));
輸出結(jié)果:4
&a[0] 是首元素的地址, 計算的是地址的大小 4/8 個字節(jié)
題目十:
printf("%d\n", sizeof(&a[0] + 1));
輸出結(jié)果:4
&a[0] 是首元素的地址,&a[0]+1 就是第二個元素的地址,大小 4/8 個字節(jié)
二.一維字符數(shù)組
首先,我們定義一個字符型數(shù)組,接下來的數(shù)組的所有題目都是基于此討論會有怎么樣的輸出(以32位機器為例)
//字符數(shù)組 char arr[] = { 'a','b','c','d','e','f' };//6 個元素
題目一:
printf("%d\n", sizeof(arr));
輸出結(jié)果:6
數(shù)組名 arr 單獨放在 sizeof 內(nèi)部,計算的是整個數(shù)組的大小,單位是字節(jié)
題目二:
printf("%d\n", sizeof(arr + 0));
輸出結(jié)果:4
arr 是首元素的地址==&arr[0],是地址就是 4/8 個字節(jié)
題目三:
printf("%d\n", sizeof(*arr));
輸出結(jié)果:1
arr是首元素的地址,*arr就是首元素,大小就是1Byte
題目四:
printf("%d\n", sizeof(arr[1]));
輸出結(jié)果:1
訪問數(shù)組第一個元素大小,為char類型
題目五:
printf("%d\n", sizeof(&arr));
輸出結(jié)果:4
&arr是數(shù)組的地址,sizeof(&arr)就是 4/8 個字節(jié)
題目六:
printf("%d\n", sizeof(&arr + 1));
輸出結(jié)果:4
&arr+1 是跳過數(shù)組后的地址,是地址就是 4/8 個字節(jié)
題目七:
printf("%d\n", sizeof(&arr[0] + 1));
輸出結(jié)果:4
第二個元素的地址,是地址就是 4/8 Byte
三.二維數(shù)組
我們初始化二維數(shù)組如下,接下來的數(shù)組的所有題目都是基于此討論會有怎么樣的輸出(以32位機器為例)
int a[3][4] = { 0 };
題目一:
printf("%zd\n", sizeof(a));
輸出結(jié)果:48
數(shù)組名 a 單獨放在了 sizeof 內(nèi)存,表示整個數(shù)組,sizeof(a) 計算的是數(shù)組的大小,單位是字節(jié)
題目二:
printf("%zd\n", sizeof(a[0][0]));
輸出結(jié)果:4
a[0][0] 是數(shù)組的第一行第一個元素,這里計算的就是一個元素的大小,單位是字節(jié)
題目三:
printf("%zd\n", sizeof(a[0]));
輸出結(jié)果:16
a[0] 是第一行這個一維數(shù)組的數(shù)組名,數(shù)組名單獨放在了 sizeof 內(nèi)部,sizeof(a[0]) 計算的整個第一行這個一維數(shù)組的大小
題目四:
printf("%zd\n", sizeof(a[0] + 1));
輸出結(jié)果:4
a[0] 并非單獨放在 sizeof 內(nèi)部,也沒有 &,所以 a[0] 表示第一行這個一維數(shù)組首元素的地址,也就是第一行第一個元素的地址
a[0] <---> &a[0][0]
a[0]+1 ---> &a[0][1]
題目五:
printf("%zd\n", sizeof(*(a[0] + 1)));
輸出結(jié)果:4
a[0] + 1是第一行第二個元素的地址,*(a[0] + 1))就是第一行第二個元素
題目六:
printf("%zd\n", sizeof(a + 1));
輸出結(jié)果:4
a 作為二維數(shù)組的數(shù)組名,并沒有單獨放在 sizeof 內(nèi)部,也沒有 &,a 就是數(shù)組首元素的地址,也就是第一行的地址, a 的類型是 int(*)[4],a+1 就是第二行的地址,類型是:int(*)[4]
題目七:
printf("%zd\n", sizeof(*(a + 1)));
輸出結(jié)果:16
a+1是第二行的地址,*(a+1)就是第二行,計算的就是第二行的大小
另外一個角度理解:*(a+1) -- a[1],sizeof(a[1]) - a[1] 這個第二行的數(shù)組名,單獨放在了 sizeof 內(nèi)部,計算的是第二行的大小
題目八:
printf("%zd\n", sizeof(&a[0] + 1));
輸出結(jié)果:4
a[0] 是第一行的數(shù)組名,&a[0] 取出的是數(shù)組的地址,取出的是第一行這個一維數(shù)組的地址,類型就是 int(*)[4] ,&a[0]+1 就是第二行的地址,類型就是 int(*)[4]
題目九:
printf("%zd\n", sizeof(*(&a[0] + 1)));
輸出結(jié)果:16
*(&a[0] + 1) 得到的就是第二行,計算的就是第二行的大小
題目十:
printf("%zd\n", sizeof(*a));
輸出結(jié)果:16
a 表示數(shù)組首元素的地址,也就是第一行的地址,*a 就是第一行,也就相當于是第一行的數(shù)組名,*a--> *(a+0) -- a[0]
題目十一:
printf("%zd\n", sizeof(a[3]));
輸出結(jié)果:16
輸出結(jié)果不會越界,還是作為一行的結(jié)果進行輸出,代表一行的大小,所以是 16
總結(jié)
到此這篇關于c/c++那些你一定會出錯的數(shù)組筆試題的文章就介紹到這了,更多相關c/c++數(shù)組筆試題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言連接并操作Sedna XML數(shù)據(jù)庫的方法
這篇文章主要介紹了C語言連接并操作Sedna XML數(shù)據(jù)庫的方法,實例分析了C語言操作XML文件的相關技巧,需要的朋友可以參考下2015-06-06