5、C语言面试笔试--数据组织--数组
文章目錄
- 1、一維數(shù)組
- 2、一維數(shù)組和指針的區(qū)別
- 3、sizeof的使用
- 4、二維數(shù)組
- 5、用一級(jí)指針訪問二維數(shù)組元素
- 6、字符數(shù)組和字符串?dāng)?shù)組
- 7、strlen函數(shù)與sizeof運(yùn)算符號(hào)的差別
- 8、指針數(shù)組
1、一維數(shù)組
注意:和普通變量一樣,定義的未初始化全局?jǐn)?shù)組和靜態(tài)局部數(shù)組存放在BSS段,定義的已初始化全局?jǐn)?shù)據(jù)和靜態(tài)局部數(shù)組存放在靜態(tài)數(shù)據(jù)區(qū)。而函數(shù)內(nèi)定義的局部數(shù)組(不包括靜態(tài)數(shù)組)存放在棧空間中。
“長度表達(dá)式”可以包含常量,但不能包含變量。也就是說,C語言不允許對數(shù)組的大小做動(dòng)態(tài)定義,即數(shù)組的大小不依賴于程序運(yùn)行過程中變量的值。
由于const定義的常量具有變量的性質(zhì),這類常量也不能作為定義數(shù)組的“長度表達(dá)式”,例如“const int NUM=10;int a[NUM];”在C語言中編譯錯(cuò)誤,在C++中編譯正確。
注意,在定義數(shù)組時(shí)“長度表達(dá)式”可以包含常量,但是不能包含變量。
對于局部數(shù)組,若沒有進(jìn)行初始化,其所有元素值為垃圾值,若初始化時(shí)僅對部分元素賦了初值,其余元素取默認(rèn)值(數(shù)值型為0,字符型為空字符);
除了初始化,數(shù)組名不能作為左值,因?yàn)?#xff0c;它是一個(gè)表示首元素地址的常量。例如定義 int a[3]后執(zhí)行a={1,2,3}是錯(cuò)誤的
2、一維數(shù)組和指針的區(qū)別
在C語言中,規(guī)定數(shù)組名代表數(shù)組的首元素的地址,也就是說,數(shù)組名就具有地址的概念,而且是一個(gè)地址常量,因此可以將數(shù)組名(即在內(nèi)存中存放該數(shù)組的首地址)賦給指針。
特別注意:數(shù)組名a代表的是該數(shù)組首元素的地址,而不是數(shù)組a的首地址,a與&a[0]的含義相同,如“a=&a[0]”返回真,是正確的比較。
&a表示整個(gè)數(shù)組的首地址,但是在執(zhí)行語句printf("%x,%x\n",a,&a);時(shí)輸出的a和&a是相同的,那么兩者有什么區(qū)別呢?其中區(qū)別主要是步長的不同,a+i=a+isizeof(int),其步長為sizeof(int),即一個(gè)數(shù)組元素的長度,而&a+i=&a+i(a數(shù)組的大小),其中步長為a數(shù)組的大小。盡管a和&a的值相同,但表示不同的含義,"&a==a"是錯(cuò)誤的比較。
為了清楚地說明&a和a的差別,這里采用地址分級(jí)的概念,數(shù)組元素的地址稱為一級(jí)地址(其值可以賦給一級(jí)指針),而一級(jí)地址的地址稱為二級(jí)地址,以此類推,不同級(jí)別的地址是不能比較的,因?yàn)閷?yīng)的步長不同。一維數(shù)組名a是一級(jí)地址,而&a中加了一個(gè)取地址運(yùn)算符升級(jí)為二級(jí)地址。
對于一維數(shù)組元素,char s[]=“abc”;
定義的是一個(gè)字符數(shù)組,所以相當(dāng)于定義了一些空間來存放“abc”,如果數(shù)組s是已初始化的全局?jǐn)?shù)組或者靜態(tài)局部則存放在靜態(tài)數(shù)據(jù)區(qū),如果它是在函數(shù)內(nèi)部定義的局部數(shù)組則存放在棧空間中。
對于*p="abc"中的abc是常量,存儲(chǔ)在靜態(tài)局部數(shù)據(jù)區(qū)域。
另外還要特別強(qiáng)調(diào)的是*(a+i)a[i] *(p+i) 和p[i]是等價(jià)的
p++=1的功能是將p所指的元素修改為1,然后讓p指向下一個(gè)元素;
++p=1的功能是先執(zhí)行++p再執(zhí)行p,先讓p指向下一個(gè)元素,并將這個(gè)元素的值修改為1.
(p)++的功能是先指向p。然后再將p的值加1;
3、sizeof的使用
指針變量的sizeof:指針變量的sizeof等于計(jì)算機(jī)內(nèi)部地址總線的寬度,所以在32位計(jì)算機(jī)中一個(gè)指針變量的返回值必定是4(注意結(jié)果是以字節(jié)為單位)
數(shù)組的sizeof,對數(shù)組做sizeof運(yùn)算等效于對其元素類型做sizeof的結(jié)果乘以數(shù)組元素的個(gè)數(shù),即sizeof返回整個(gè)數(shù)組在內(nèi)存中占用的內(nèi)存字節(jié)數(shù)。
sizeof的副作用:
sizeof是運(yùn)算符,跟加減乘除的性質(zhì)是其實(shí)是一樣的,在編譯的時(shí)候就開始執(zhí)行了,而不是在程序執(zhí)行時(shí)才執(zhí)行。
sizeof(i++);
其中i++并不執(zhí)行,因此i++的作用被消除了。
4、二維數(shù)組
二維數(shù)組元素的引用方式如下:
數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]
其中,下標(biāo)表達(dá)式可以是整型常量或整型表達(dá)式。注意不能為變量或者const
對于給了數(shù)組部分元素賦初值的,其余自動(dòng)賦值為0;
由于二維數(shù)組a[3][4]也就相當(dāng)于a={a[0][4],a[1][4],a[2][4]},每個(gè)一維數(shù)組元素又包含有4個(gè)元素。這種降維的思路可以擴(kuò)展到3維和四維以上的數(shù)組。a數(shù)組有三行,將它們看成3個(gè)一維數(shù)組元素,即a={a[0],a[1],a[2]},每個(gè)一維數(shù)組元素又含有4個(gè)元素。這種降維的思路可以擴(kuò)展到3維或4維以上。
數(shù)組名a代表的是該二維數(shù)組首元素a[0]的首地址,即a與&a[0]的含義相同.也就是說a與&a[0]的含義相同,“a=&a[0]”返回真,是正確的比較。其中a[0]又和&a[0][0]的含義相同,所以a==&&a[0][0].
二維數(shù)組名是一個(gè)二級(jí)地址(例如**a的結(jié)果為a[0][0]),三維數(shù)組名是一個(gè)三級(jí)地址。
&a是整個(gè)二維數(shù)組的首地址,為三級(jí)地址,所以“a==&a”的比較是錯(cuò)誤的。
其實(shí),我們只要記住數(shù)組名a代表的是首元素的地址,二維數(shù)組降解為一維數(shù)組來看。
此外變址運(yùn)算符號(hào)“【】”相當(dāng)于*(+)
所以a[i][j],*(a[i]+j), *(*(a+i)+j)三者相同都表示第i行j列元素
5、用一級(jí)指針訪問二維數(shù)組元素
可以把二維數(shù)組看成是以一維數(shù)組作為元素的二維數(shù)組
#include <stdio.h> #include <malloc.h> void main() {int i;int a[3][2]={{0,1},{2,3},{4,5}};int *p=a[1];for (i=0;i<2;i++)printf("%d",*p++); }輸出2 3
若有定義int a[3][4] ,不能表示a[1][1]的是() A、*(&a[0][0]+5) B、*(*(a+1)+1) C、*(&a[1]+1) D、*(a[1]+1)正確答案C
C選項(xiàng)表示的是a[2][2]
6、字符數(shù)組和字符串?dāng)?shù)組
字符數(shù)組的定義
由于C語言中沒有直接提供字符串類型,字符串被定義為一個(gè)字符數(shù)組。例如:
一個(gè)字符數(shù)組的字符構(gòu)成一個(gè)字符串,這個(gè)字符串結(jié)束標(biāo)志是ASCII碼為0的字符,即空字符,表示成‘\0’。例如上面定義的str字符數(shù)組最多可以存儲(chǔ)9個(gè)字符,還剩一個(gè)字符位置用來存放結(jié)尾符。
字符數(shù)組初始化的兩種方式:
注意:
與普通數(shù)組一樣,字符數(shù)組名是地址常量,其值為數(shù)組本身在內(nèi)存中存放區(qū)域的首地址,即字符串中第一個(gè)字符的存儲(chǔ)地址,所以賦值語句s="ABCD"是錯(cuò)誤的。
初始化少于定義的數(shù)組元素的個(gè)數(shù),這時(shí)候被賦予空格符 (空格符不同于空字符,空字符的ASCII 碼為0,空格符的ASCII碼為32)。
C語言中常用的字符串處理函數(shù):
字符串?dāng)?shù)組
字符串?dāng)?shù)組的定義:它的每個(gè)元素都是一個(gè)字符串。字符串?dāng)?shù)組是二維數(shù)組。
S【0】表示數(shù)組中第一個(gè)字符串首元素的地址,為一維地址。
注意S【0】=“ABCD”這種賦值是錯(cuò)誤的,因?yàn)镾【0】是一個(gè)地址常量,不允許對它賦值;
而S[0][0]="ABCD"也是錯(cuò)誤的,因?yàn)镾【0】【0】是字符,不是字符串。
使用scanf或者gets函數(shù)賦值
使用scanf或者gets函數(shù)只能給一個(gè)字符串賦值,即每次只能給字符串?dāng)?shù)組中的一個(gè)一維地址的元素賦值。
使用標(biāo)準(zhǔn)字符串函數(shù)賦值:
使用標(biāo)準(zhǔn)字符串函數(shù)strcpy等實(shí)現(xiàn)字符串的復(fù)制等,例如:
7、strlen函數(shù)與sizeof運(yùn)算符號(hào)的差別
strlen函數(shù)用于求一個(gè)字符串的實(shí)際長度,從開始字符到遇見第一個(gè)’\0’,如果只定義沒有給它賦予初值,這結(jié)果是不定的,它會(huì)從首地址一直找下去,知道遇到‘\0’停止。sizeof返回的是變量定義后所占內(nèi)存的字節(jié)數(shù),不是實(shí)際長度。
例如, char a[5],strlen(a)的結(jié)果是不定的,因?yàn)閿?shù)組a沒有賦初值,而sizeof(a)的結(jié)果為5
strlen的結(jié)果是要在執(zhí)行時(shí)才能計(jì)算出來,是用來計(jì)算字符串的長度,不是類型占內(nèi)存的大小;而sizeof不能返回動(dòng)態(tài)分配的空間大小。
8、指針數(shù)組
當(dāng)多個(gè)基類型相同的指針變量集合成數(shù)組時(shí),就形成了指針數(shù)組。指針數(shù)組時(shí)指針的集合,它的每個(gè)元素都是一個(gè)指針變量。
總結(jié)
以上是生活随笔為你收集整理的5、C语言面试笔试--数据组织--数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1、C++招聘笔试--C++中的C
- 下一篇: Xilinx IP核之FIFO