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