[C程序设计语言]第一部分
數(shù)組
局部數(shù)組定義時如果未指定長度,又未指定數(shù)組內(nèi)容,則編譯報錯。但全局的好像可以在定義時不指定長度的情況下也不指定數(shù)組內(nèi)容,但編譯時會有警告,內(nèi)存全清零,并可以對它進(jìn)行某個元素的讀寫,但如果下標(biāo)索引過大可能引起內(nèi)存讀寫錯誤。
?
在定義數(shù)組時可以不指定數(shù)組長度,而只指定數(shù)組內(nèi)容。也可既指定長度,又指定數(shù)組內(nèi)容。
?
C語言中的定義的多維數(shù)組是定長的,不像Java那樣可以在定義時不指定多維數(shù)組長度,而指定不同長度的維度內(nèi)容,如果C中如此定義,則列的長度為某個維度中最長的長度。
?
如果在C語言要定義多維不定長的數(shù)組,則只能通過指針的形式來指定多維數(shù)組,即數(shù)組里的非第一維采用指針形式定義,如字符串指針數(shù)組。
?
C語言中的字符串可以使用一個最末元素為’\0’的空字符來定義。也可將一個字符串直接賦值給一個數(shù)組。
?
定義多維數(shù)組時,除了第一維不需要指定大小外,其他維都需要指定數(shù)組大小。
?
Java在聲明一個數(shù)組時,不能指定數(shù)組大小,這與C不同,在new時可以省略后面的維度大小,不能省略前面而指定后面大小: int? b[][][]= newint[1][][];也可以這樣:int a[][][] = { { { 1 }, { 2, 3 } } };,C語言只允許以后面這樣形式定義: int a[][1][1] ={{{1}}};,只允許省略第一維大小(在有初始化的情況下,如果定義時未馬上初始化,則第一維也不能省略),也可都不省略,但最好別省略,且初始化時定義時大小與初始化的大小一致,否則容易出問題。
?
如果初始化值的個數(shù)少于數(shù)組元素的個數(shù),剩余的元素被自動初始化為0(多維數(shù)組也是這樣),例如,可以用下面的語句將數(shù)組n的元素初始化為0:int a[10]={0};。但千萬要記住:數(shù)組的元素不會被自動初始化為0——程序員至少要把第一個數(shù)組元素初始為0才能使剩下的元素自動初始化為0。
?
C語言不檢查數(shù)組是否越界。
?
如下的數(shù)組聲明會導(dǎo)致語法錯誤,因?yàn)閿?shù)組元素只有5個而初始化值卻有6個:int a[5] = { 1, 2, 3, 4, 5, 6 };,初始化值列表中的初始化值個數(shù)多于數(shù)組元素的個數(shù)是一種語法錯誤。
?
如果在聲明帶有初始化值列表的數(shù)組時省略數(shù)組的大小(如果沒有初始化列表則不能省略),那么數(shù)組元素的個數(shù)就是初始化列表中的元素個數(shù),例如:int a[] = { 1, 2, 3, 4, 5, 6 };,建立一個有6個元素的數(shù)組。
?
聲明為static的數(shù)組是在編譯時一次性初始化的,如果程序員沒有明確地初始化靜態(tài)數(shù)組,那么編譯器把它初始化為0。
?
數(shù)組實(shí)際上就是數(shù)組的第一個元素的地址:
int main(int argc, char * argv[]) {
??? char array[5];
??? printf("%p \n", array);//0022FF4B
??? printf("%p \n",&array[0]);//0022FF4B
??? return 0;
}
轉(zhuǎn)換說明符%p通常用來以十六進(jìn)制格式輸出地址。
?
數(shù)組通過引用進(jìn)行參數(shù)傳遞會提高性能。如果用傳值的方式傳遞數(shù)組就會傳遞每一個元素的值拷貝。對于頻繁傳遞的大型數(shù)組來說,對數(shù)組進(jìn)行拷貝會消耗一定時間與內(nèi)存。
?
數(shù)組作為參數(shù)聲明時,可以不必定義數(shù)組的大小,如果即使包括了,編譯器會把它忽略掉。對多維數(shù)組來說,第一個下標(biāo)也是不必要的,但是要給出其后所有的下標(biāo),編譯器用這些下標(biāo)確定這些元素在內(nèi)存中的位置。
?
C語言也會忽略函數(shù)原型(使用前的聲明)中的變量名。切記:函數(shù)原型只是告訴編譯器出現(xiàn)在函數(shù)中的參數(shù)的個數(shù)和參數(shù)的類型。
?
多維數(shù)組也可這樣定義:int array[2][3] = { 1, 2, 3, 4, 5 };,這樣像一維那樣,它會按照順序先初始化第一行,再初始化第二行,這里最后一個元素 array[1][2] 未被初始化,所以為0。
?
在將多維數(shù)組做為函數(shù)的參數(shù)時,第一個下標(biāo)也是不必要的(如果寫了編譯器也會忽略掉),但是要給出其后其他所有的下標(biāo),因?yàn)榫幾g器要用這些下標(biāo)確定這些元素在內(nèi)存中的位置,不管數(shù)組的下標(biāo)有多少個,所有的元素都是在內(nèi)存中連續(xù)存放的,所以編譯要根據(jù)第一個下標(biāo)后面所其他下標(biāo)來定位元素(定位時需要跳過多少個元素):void printArray(int a[][3])
?
多維數(shù)組的數(shù)組名為第一維中第一個元素(可能又是一個多維數(shù)組)的地址。
extern
如果程序包含在多個源文件中,而某個外部(全局)變量在file1文件中定義、在file2和file3文件中使用,那么在文件file2與file3中就需要使用extern聲明來建立該變量與其定義之間的聯(lián)系。
“定義”與“聲明”
“定義”表示創(chuàng)建變量或分配存儲空間,而“聲明”指的是說明變量的性質(zhì),但不分配存儲單元。
下面即是聲明:int lower,upper,step;
?
聲明用于說明每個標(biāo)識符的含義,而并不需要為每個標(biāo)識符預(yù)留存儲空間,預(yù)留存儲空間的聲明稱為定義。
變量命名規(guī)則
與Java一樣 A$0
標(biāo)準(zhǔn)規(guī)定,標(biāo)識符前至少31個字符有效,在某些實(shí)現(xiàn)中,有效字符可能會更多。
數(shù)據(jù)類型
char
int
float
double
short (int)
long (int)
float
double
long double
?
int通常代表特定機(jī)器中整數(shù)的自然長度。short類型通過為16位,long類型通常為32位,int類型可能是16或32位。各編譯器可以根據(jù)硬件特殊自主選擇合適的類型長度,但要遵循下列限制:short與int類型至少為16位,而long類型至少為32位,并且short類型不得長于int類型,而int類型不得長于long類型。
?
類型限定符signed與unsigned可以限定char類型或任何整型。
?
有關(guān)這些類型長度定義的符號常量以及其他與機(jī)器和編譯有關(guān)的屬性可以在標(biāo)準(zhǔn)頭文件<limits.h>與<float.h>中找到。
?
c++有bool類型,標(biāo)準(zhǔn)C沒有布爾類型,用整型代替布爾類型,非0表示真,0表示假
?
整型常量若以字母u或U為后綴,則表示它是一個無符號數(shù);若以字母1或L為后綴,則表示它是一個長整型數(shù);若以字母UL為后級,則表示它是一個無符號長整型數(shù)
?
整型常量的類型同它的形式、值和后輟有關(guān)。如果它沒有后綴且是十進(jìn)制表示,則其類型很可能是int,long int或unsigned long int;如果它沒有后綴且是八進(jìn)制或+六進(jìn)制表示,則其類型很可能是int,unsigned int,long int,unsigned long int;如果它的后緩為u或U,則其類型很可能是unsigned int,ungigned long int;果它的后緩為l或L,則其類型很可能是unsigned int,ungigned long int
?
C中的整型常量默認(rèn)都是int類型的常量,但如果一個整數(shù)太大以至于無法用int類型表示時,也將被當(dāng)作long類型處理。
?
無符號常量以字母u或U結(jié)尾。后綴ul或UL表示是 unsigned long類型,通常用在八進(jìn)制或十進(jìn)制常量后面來標(biāo)示最高位到底是符號位還是數(shù)字位,而用在十進(jìn)制后也是一樣。
?
沒有后綴的浮點(diǎn)數(shù)常量為double類型,后綴f或F表示float類型,而后綴l或L則是表示long double類型
?
八進(jìn)制使用0開頭,十六進(jìn)制使用0X開頭。
?
0XFF=255?????? char
0XFFFF=65535?? short
0XFFFFFFFF=-1? int
如果十六進(jìn)制常量位數(shù)不達(dá)到整型int所占位數(shù)時,常量首位被看作數(shù)字位,而非符號位,如果超過int,則按long來處理。
?
unsigned short a=0xFFFF ,則a=65535,但如果去掉unsigned修飾符后,a=-1,這也從另一方面驗(yàn)證了“整型常量默認(rèn)都是int類型的常量”
??? unsignedshort a1 = 0xFFFF;
??? short a2 = 0xFFFF;
??? printf("%d \n", a1);//65535
??? printf("%d \n", a2);//-1
??? printf("%d \n", 0xFFFF);//65535
?
??? unsignedshort a3 = -1;
??? short a4 = -1;????????????
??? printf("%d \n", a3);//65535
??? printf("%d \n", a4);//-1
??? printf("%d \n", -1u);//-1
?
在C中可以將大的數(shù)據(jù)類型賦給小的數(shù)據(jù)類型(比如將long賦值給short類型的變量),不像Java那樣需要強(qiáng)轉(zhuǎn):否則非法。
?
?
當(dāng)把較長的整數(shù)轉(zhuǎn)換為較短的整數(shù)或char類型時,超出的高位部分將被丟棄。如將一個float類型賦值給一個int類型變量時,小數(shù)部分將被截取掉;但當(dāng)把double類型賦值給float類型時,是進(jìn)行四舍五入還是截取這取決于具體實(shí)現(xiàn)。
?
算術(shù)類型提升與轉(zhuǎn)換規(guī)則
首先,如果任何一個操作數(shù)為 long double 類型,則另一個操作數(shù)轉(zhuǎn)換為 long double 類型。
否則,如果任何一個操作數(shù)為 double 類型,則將另一個操作數(shù)轉(zhuǎn)換為 double 類型。
否則,如果任何一個操作數(shù)為 float 類型,則將另一個操作數(shù)轉(zhuǎn)換為 float 類型。
否則,如果任何一個操作數(shù)為 unsigned long int 類型,則將另一個操作數(shù)轉(zhuǎn)換為 unsigned long int類型。
否則,如果一個操作數(shù)為 long int 類型且另一個操作數(shù)為 unsigned int 類型,則結(jié)果依賴于long int類型是否可以表示所有的unsigned int類型的值。如果可以,則將unsigned int類型的操作數(shù)轉(zhuǎn)換為long int;否則將兩個操作數(shù)都轉(zhuǎn)換為usigned long int。
否則,如果一個操作數(shù)為long int類型,則將另一個操作數(shù)轉(zhuǎn)換為long int類型。
否則,如果任何一個操作數(shù)為unsigned int類型,則將另一個操作數(shù)轉(zhuǎn)換為unsigned int類型。
否則,將兩個操作數(shù)都轉(zhuǎn)換成int類型。
?
注,表達(dá)式中float類型的操作數(shù)不會自動轉(zhuǎn)換成double類型(在沒有double類型操作數(shù)的情況下,與int類型不同)
?
假定int類型占有16位,long類型占32位,那么,-1L>1UL,這是因?yàn)?/span>-1L將被提升為unsigned long類型,因而成為一個比較大正數(shù)。
void
void對象的(不存在的)值不能夠以任何方式使用,也不能被顯式或隱式地轉(zhuǎn)換為任一非空類型。因?yàn)榭?/span>(void)表達(dá)式表示一個不存在的值,這樣的表達(dá)式只可以用在不需要值的地方
可以通過強(qiáng)制類型轉(zhuǎn)換將表達(dá)式轉(zhuǎn)換為void類型。
\000、\xhh
\000最大字符可表示為 \377,第一位不能大于3(在有三位的情況下),因?yàn)橐坏┐笥?#xff0c;則表示的總位數(shù)會大于8位。注,也可只使用2位8進(jìn)制位來表示,則此時第一位就可以使用大于3的數(shù)表示了,另外也可只有一位,比如空字符 \0。
\378此時表示兩個字符 \37 與 8
\xhh一樣,最多兩位,也可以只有一位十六進(jìn)制。
ANSI C中所有轉(zhuǎn)義字符
\a?? 響鈴
\b?? 回退
\f??? 換頁
\n?? 換行
\r??? 回車
\t??? 橫向制表
\v?? 縱向制表
\\
\\?
\’
\”
\000
\xhh
\0
字符常量 ‘\0’ 表示值為0的字符,也就是空字符(null),但我們通常用 ‘\0’ 的形式代替 0 ,以強(qiáng)調(diào)某些表達(dá)式的字符屬性,但其數(shù)字值為0
?
轉(zhuǎn)載于:https://www.cnblogs.com/jiangzhengjun/p/4255830.html
總結(jié)
以上是生活随笔為你收集整理的[C程序设计语言]第一部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个被遗忘的ccflow工作流引擎自定义
- 下一篇: 为何类型转型Integer[] = Ob