1.1 一維數組的聲明與字符數組
1.1.1 一維數組的聲明與初始化
1.一維數組的聲明
一維數組聲明應指出以下三點:
1)存儲在每個元素中的值的類型;
2)數組名;
3)數組中的元素數,數組的元素數必須用值大于等于1的常量表達式定義。
數組定義中的類型可以是內置數據類型或類類型;除引用之外,數組元素的類型還可以是任意的復合類型。數組定義中類型不能是引用,即沒有引用數組,這是因為引用是不能賦值的,而數組中的元素必須可以被賦值。
例1:如下定義是否正確?
int& a[10];
解答:定義錯誤。VC++6.0提示arrays of references are illegal。
雖然沒有引用數組,但數組可以有引用。
例2:定義數組a的引用。
int a[6]={0, 2, 4, 6, 8, 10};
解答:int (&p)[6]=a;
如上,p是數組a的引用。數組的引用可以用于函數實參傳遞。此時可確保傳遞過來的數組長度合乎要求。
2.一維數組的初始化
在定義數組時,可為其元素提供一組用逗號分隔的初值,這些初值用花括號{}括起來,稱為初始化列表。
數組元素初始化時,若沒有顯式提供元素初值,則元素會被像普通變量一樣初始化:
1)函數體外定義的內置類型數組(即內置類型的全局數組),元素初始化為0;
2)函數體內定義的內置類型數組,元素無初始化(注意,若只初始化部分元素,其后的元素此時也會被初始化為0);
3)如果不是內置類型,則不管其在哪定義,自動調用其默認構造函數為其初始化,若該類無默認構造函數則會報錯。
例1:給定如下代碼:
int x[4]={0}; int y[4]={1};
數組x和y的值為__________?(2011·阿里巴巴)
A.{0,0,0,0},{1,1,1,1}
B.{0,0,0,0},{1,0,0,0}
C.{0,不確定},{1,不確定}
D.與編譯器相關
解答:B。
當數組的大小未知時,需要動態聲明一維數組,聲明格式如下:
int* a=new int[n];
當數組使用完畢,需要使用:
delete []a;
釋放內存空間。
1.1.2 C風格字符串與字符數組
1.C風格字符串
C風格字符串包括兩種:
1)字符串常量
以雙引號括起來的字符序列是字符串常量。為了兼容C語言,C++中所有的字符串常量都由編譯器自動在末尾添加一個空字符。
字符常量'A'表示單個字符A,然而"A"是字符串常量,其表示字母A和空字符(null)兩個字符。
2)末尾添加了'\0'的字符數組。
可見,C風格字符串末尾必須有一個字符'\0'。
例1:下列 是不正確的字符常量?(2012·中興)
A.'n'
B.'l'
C."a"
D.'\101'
解答:C。C選項是一個字符串常量,其包含字符'a'與空字符兩個字符。
例2:下列哪些是C風格字符串?
char ca1[]={'C', '+', '+'}; char ca2[]={'C', '+', '+', '\0'}; char ca3[]="C++"; const char *cp="C++"; char *cp1=ca1; char *cp2=ca2;
解答:ca1和cp1不是C風格字符串:ca1是一個不帶結束符null的字符數組,而指針cp1指向ca1的首字符,因此,它指向的并不是以null結束的數組。其他的聲明則都是C風格字符串。
2.字符數組
字符數組既可以用一組由花括號括起來、逗號隔開的字符常量進行初始化,也可以用一個常量字符串(末尾有空字符)進行初始化。如下:
方式1:char ca1[]={'C', '+', '+'}; // 末尾沒有null字符 char ca2[]={'C', '+', '+', '\0'}; // 末尾顯式地添加null字符 方式2:char ca3[]="C++"; // 末尾自動添加null字符
然而,要注意這兩種初始化形式并不完全相同,因為字符串常量包含一個額外的空字符(null)用于結束字符串。當使用字符串常量值來初始化創建的新數組時,將在新數組末尾加入空字符。
故ca1的長度是3,而ca2和ca3的長度則是4。
注意:字符數組ca2與ca3都可被稱為C風格字符串,而字符數組ca1不是C風格字符串。
使用方式2中C風格字符串初始化字符數組時,一定要記得添加在末尾的空字符。
例1:下面的初始化是否正確?
const char ch3[6]="Daniel";
解答:上述C風格字符串包含了6個顯式字符,而存放該字符串的數組必須有7個元素,其中6個用于存儲字符常量值,而1個用于存放空字符。故將導致編譯時的錯誤。
例2:給出以下定義, 則正確的敘述為______。(2011淘寶)
char x[]="abcdefg"; char y[]={'a', 'b', 'c', 'd', 'e', 'f', 'g'};
A.數組x和數組y等價
B.數組x和數組y長度相同
C.數組x的長度大于數組y的長度
D.數組x的長度小于數組y的長度
解答:C?!皃rintf("%d\n", sizeof(x));”輸出8;“printf("%d\n", sizeof(y));”輸出7。
因為x數組是C風格字符串,后面還有結束符:'\0',所以長度為8;
而y數組就是普通的字符數組,沒有'\0'結束符,所以長度為7。
C/C++中有很多字符串處理函數(strcpy、strcat等),傳遞給這些標準庫函數例程的指針必須具有非零值,并且指向以null結束的字符數組(例2中的數組x可傳遞給這些函數,而y不能)中的第一個元素。其中一些標準庫函數會修改傳遞給它的字符串,這些函數將假定它們所修改的字符串具有足夠大的空間接收本函數新生成的字符,程序員必須確保目標字符串足夠大。
在使用處理C風格字符串的標準庫函數時,牢記參數必須以結束符null結束:
char ca[]={'C', '+', '+'}; cout << strlen(ca) << endl;
在上述代碼中,ca是一個沒有null結束符的字符數組(即ca不是C風格字符串),計算的結果不可預料。標準庫函數strlen總是假定其參數字符串以null字符結束,當調用該標準庫函數時,系統將會從實參ca指向的內存空間開始一直搜索結束符,直到恰好遇到null為止。strlen返回這一段內存空間中總共有多少個字符,無論如何這個數值不可能是正確的。
例3:下面程序段的運行結果是( ?。?。(2012·迅雷)
char c[5]={'a', 'b', '\0', 'c', '\0'}; printf("%s", c);
A.'a"b'
B.ab
C.ab_c
D.ab_c_(其中_表示空格)
解答:B。字符串輸出遇'\0'終止。
關于字符串處理函數的更多介紹請參考后續章節。