【C语言重点难点精讲】关键字精讲
必讀:
- C語(yǔ)言關(guān)鍵字是一個(gè)非常重要的話題,因?yàn)樗茉谙喈?dāng)?shù)某潭壬蠈語(yǔ)言的核心內(nèi)容串聯(lián)起來(lái),起到一種提綱挈領(lǐng)的效果
- 下面的內(nèi)容重點(diǎn)提及的是相應(yīng)關(guān)鍵字特別值得注意的地方,這些地方是我們經(jīng)常忽略的,而且考試也會(huì)經(jīng)常涉及到
- 講解這些關(guān)鍵字時(shí)默認(rèn)大家都有C語(yǔ)言的基礎(chǔ),因此不會(huì)從0開始談起
文章目錄
- 一:auto關(guān)鍵字
- 二:register關(guān)鍵字
- (1)存儲(chǔ)器分級(jí)
- (2)register修飾變量
- 三:static關(guān)鍵字
- (1)修飾全局變量和函數(shù)
- (2)修飾局部變量
- 四:sizeof關(guān)鍵字
- 五:signed、unsigned關(guān)鍵字
- 六:if、else
- (1)關(guān)于C語(yǔ)言中bool類型
- (2)float與“零值”的比較
- (3)if和else的匹配問(wèn)題
- 七:switch-case組合
- 八:do 、while 、for關(guān)鍵字
- 九:goto關(guān)鍵字
- 十:void關(guān)鍵字
- 十一:return關(guān)鍵字
- 十二:const關(guān)鍵字
- 十三:volatile關(guān)鍵字
- 十四:extern關(guān)鍵字
- 十五:struct關(guān)鍵字
- 十六:Union關(guān)鍵字
- 十七:enum關(guān)鍵字
- 十八:typedef關(guān)鍵字
- 總結(jié)
- (1)關(guān)鍵字分類
一般來(lái)講,C語(yǔ)言一共有32個(gè)關(guān)鍵字(C90標(biāo)準(zhǔn)),當(dāng)然C99后又新增了5個(gè)關(guān)鍵字,不過(guò)我們還是重點(diǎn)討論這32個(gè)關(guān)鍵字
| auto | 聲明自動(dòng)變量 |
| short | 聲明短整型變量或函數(shù) |
| int | 聲明整形變量或函數(shù) |
| long | 聲明長(zhǎng)整形變量或函數(shù) |
| float | 聲明浮點(diǎn)型變量或函數(shù) |
| double | 聲明雙精度變量或函數(shù) |
| char | 聲明字符型變量或函數(shù) |
| struct | 聲明結(jié)構(gòu)體變量或函數(shù) |
| union | 聲明共用數(shù)據(jù)類型 |
| enum | 聲明枚舉類型 |
| typedef | 用以給數(shù)據(jù)類型取別名 |
| const | 聲明只讀變量 |
| unsigned | 聲明無(wú)符號(hào)類型變量或函數(shù) |
| signed | 聲明有符號(hào)類型變量或函數(shù) |
| extern | 聲明變量是在其它文件中正聲明 |
| register | 聲明寄存器變量 |
| static | 聲明靜態(tài)變量 |
| volatile | 說(shuō)明變量在程序執(zhí)行過(guò)程中可以被隱含地改變 |
| void | 聲明函數(shù)無(wú)返回值或無(wú)參數(shù),聲明無(wú)類型指針 |
| if | 條件語(yǔ)句 |
| else | 條件語(yǔ)句否定分支(與if連用) |
| switch | 用于開關(guān)語(yǔ)句 |
| case | 開關(guān)語(yǔ)句分支 |
| for | 一種循環(huán)語(yǔ)句 |
| do | 循環(huán)語(yǔ)句的循環(huán)體 |
| while | 循環(huán)語(yǔ)句的循環(huán)條件 |
| goto | 無(wú)條件跳轉(zhuǎn)語(yǔ)句 |
| continue | 結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán) |
| break | 跳出當(dāng)前循環(huán) |
| default | 開關(guān)語(yǔ)句中的“其它”分支 |
| sizeof | 計(jì)算數(shù)據(jù)類型長(zhǎng)度 |
| return | 子程序返回語(yǔ)句,循環(huán)條件 |
一:auto關(guān)鍵字
一般來(lái)說(shuō),在代碼塊中定義的變量(也即局部變量),默認(rèn)都是auto修飾的,不過(guò)會(huì)省略。但是一定要注意:不是說(shuō)默認(rèn)的所有變量都是auto的,它只是一般用來(lái)修飾局部變量
當(dāng)然在C語(yǔ)言中,我們已經(jīng)不再使用auto了,或者稱其為過(guò)時(shí)了,但是在C++中卻賦予了auto新的功能,它變得更加強(qiáng)大了。有興趣請(qǐng)點(diǎn)擊2-6:C++快速入門之內(nèi)聯(lián)函數(shù),auto關(guān)鍵字,C++11基于范圍的for循環(huán)和nullptr
二:register關(guān)鍵字
register意味寄存器
(1)存儲(chǔ)器分級(jí)
這個(gè)概念我們?cè)谟?jì)算機(jī)組成原理中講得已經(jīng)非常詳細(xì)了,請(qǐng)點(diǎn)擊:(計(jì)算機(jī)組成原理)第三章存儲(chǔ)系統(tǒng)-第一節(jié):存儲(chǔ)器分類、多級(jí)存儲(chǔ)系統(tǒng)和存儲(chǔ)器性能指標(biāo)
(2)register修飾變量
可以看出,如果將變量放到寄存器中,那么效率就會(huì)提高。可以用register修飾的變量有以下幾種
- 局部的(全局變量會(huì)導(dǎo)致CPU寄存器長(zhǎng)時(shí)間被占用)
- 不會(huì)被寫入的(寫入的話就需要被寫回內(nèi)存,要是這樣的話register就沒有意義的)
- 高頻需要被讀取的
如果要使用,不要大量使用,因?yàn)榧拇嫫鞯臄?shù)量有限。
另外還需要注意的一點(diǎn)是:被register修飾的變量,是不能取地址的,因?yàn)樗呀?jīng)放在了寄存器中,地址會(huì)涉及到內(nèi)存,但是可以被寫入
當(dāng)然這個(gè)register關(guān)鍵字現(xiàn)在也基本不會(huì)用了,因?yàn)槿缃竦木幾g器優(yōu)化已經(jīng)很智能了,不需要你自己手動(dòng)優(yōu)化
三:static關(guān)鍵字
(1)修飾全局變量和函數(shù)
我們知道全局變量(加入關(guān)鍵字extern聲明)和函數(shù)都可以跨文件使用的
但是有一些應(yīng)用場(chǎng)景中,我們不想讓全局變量或函數(shù)跨文件訪問(wèn)應(yīng)該怎么辦呢?那么就可以使用static關(guān)鍵字
static int g_value=100;//修飾staic后全局變量將不能跨文件使用
可以看出被static修飾的全局變量是不能被外部其他文件直接訪問(wèn)的,而只能在本文件內(nèi)使用
- 需要注意這里說(shuō)的是直接訪問(wèn),那意味著可以間接訪問(wèn),比如通過(guò)函數(shù)的方式實(shí)現(xiàn)
同樣,被static修飾的函數(shù)只能在本文件內(nèi)訪問(wèn),而不能在外部其它文件中直接訪問(wèn)
- 還是需要注意,這里是不能直接訪問(wèn),并不是不能訪問(wèn),比如可以通過(guò)函數(shù)嵌套的方式
static這種功能本質(zhì)為了封裝,因?yàn)槲覀兛梢园岩恍┎恍枰蛘卟幌胍┞兜募?xì)節(jié)保護(hù)起來(lái)了,只提供一個(gè)功能函數(shù)個(gè),該函數(shù)在內(nèi)部調(diào)用它們即可,這樣的話代碼安全性也比較高
(2)修飾局部變量
我們知道全局變量?jī)H在當(dāng)前代碼塊內(nèi)有效,代碼塊結(jié)束之后局部變量會(huì)自動(dòng)釋放空間,因此下面代碼的結(jié)果就會(huì)是這樣
如果使用static修飾局部變量,會(huì)更改其生命周期,但其作用域不變,如下當(dāng)用static修飾后,變量i地址不變,且結(jié)果累加
static為什么可以更改局部變量的生命周期呢?因?yàn)楸籹tatic修飾的變量會(huì)將其從棧區(qū)移動(dòng)到數(shù)據(jù)段,當(dāng)然這就涉及到了C/C++地址空間的問(wèn)題了
查看實(shí)際地址
#include <stdio.h> #include <stdlib.h>int gobal_val=100;//全局變量已經(jīng)初始化 int gobal_unval;//全局變量未初始化 int main(int argc,char* argv[],char* env[]) {printf("main函數(shù)處于代碼段,地址為:%p,十進(jìn)制為:%d\n",main,main);printf("\n");printf("全局變量gobal_val,地址為:%p,十進(jìn)制為:%d\n",&gobal_val,&gobal_val);printf("\n");printf("全局變量未初始化gobal_unval,地址為:%p,十進(jìn)制為:%d\n",&gobal_unval,&gobal_unval);printf("\n");char* mem=(char*)malloc(10);printf("mem開辟的堆空間,mem是堆的起始地址,是%p,十進(jìn)制為:%d\n",mem,mem);printf("\n"); printf("mem是指針變量,指針變量在棧上開采,其地址為%p,十進(jìn)制為:%d\n",&mem,&mem);printf("\n"); printf("命令行參數(shù)起始地址:%p,十進(jìn)制為:%d\n",argv[0],argv[0]);printf("\n");printf("命令行參數(shù)結(jié)束地址:%p,十進(jìn)制為:%d\n",argv[argc-1],argv[argc-1]);printf("\n");printf("第一個(gè)環(huán)境變量的地址:%p,十進(jìn)制為:%d\n",env[0],env[0]);printf("\n"); }四:sizeof關(guān)鍵字
sizeof用于確定一種類型對(duì)應(yīng)在開辟空間的時(shí)候的大小,注意它是關(guān)鍵字而不是函數(shù)
它的基本用法就是下面這樣,這我就不再多說(shuō)了(注意Windows32位平臺(tái))
int main() {cout <<"char:" <<sizeof(char) << endl;cout << "short:" << sizeof(short) << endl;cout << "int:" << sizeof(int) << endl;cout << "long:" << sizeof(long) << endl;cout << "long long:" << sizeof(long long) << endl;cout << "float:" << sizeof(float) << endl;cout << "double:" << sizeof(double) << endl; }
特別注意,sizeof求一種類型大小的寫法共有三種,特別第三種很多人認(rèn)為是錯(cuò)誤的,而考試就愛給你整這些犄角旮旯的東西
五:signed、unsigned關(guān)鍵字
這一部分需要涉及數(shù)據(jù)存儲(chǔ)及原碼反碼等基礎(chǔ)概念,請(qǐng)參照以下章節(jié)
- (計(jì)算機(jī)組成原理)第二章數(shù)據(jù)的表示和運(yùn)算-第二節(jié)1:定點(diǎn)數(shù)的表示(原碼、反碼、補(bǔ)碼和移碼)
- (計(jì)算機(jī)組成原理)第二章數(shù)據(jù)的表示和運(yùn)算-第二節(jié)2:原碼、反碼、補(bǔ)碼和移碼的作用
第一點(diǎn): 需要深刻理解signed和unsigned只是對(duì)數(shù)據(jù)的一種解讀方式,其中signed會(huì)把首位數(shù)據(jù)解讀為符號(hào)位,符號(hào)位用于標(biāo)識(shí)其正負(fù),unsigned的首位也算作數(shù)據(jù)位,也就是說(shuō)類型決定了其讀寫的時(shí)候的解釋方式
因此像下面的這樣一句代碼,看似不合適,但是它是沒有問(wèn)題的,因?yàn)榇鎯?chǔ)時(shí)對(duì)于變量a它只關(guān)心我所開辟的空間上的二進(jìn)制數(shù)據(jù)放進(jìn)了沒有,并不關(guān)心你之前是怎么樣的
也就是說(shuō)b里面的存儲(chǔ)的內(nèi)容會(huì)按照不同的解釋方式而變化
第二點(diǎn): signed和unsigned也是相關(guān)C語(yǔ)言考試的重點(diǎn),下面代碼可以幫助你很好的理解
#include <windows.h> #include <stdio.h> #include <stdlib.h>int main() {unsigned int i;for (i = 9; i >= 0; i--){printf("%u\n", i);Sleep(100);}}由于變量i是無(wú)符號(hào)整形,因此在與0比較的時(shí)候,不會(huì)小于0,所以會(huì)死循環(huán),并且打印時(shí)從9開始減小到0,然后接著是42億多,然后依次減小,最后再到0
第三點(diǎn):使用unsigned時(shí)初始化變量時(shí),建議帶上u,也即
unsigned int b=10u;六:if、else
if和else如果簡(jiǎn)單點(diǎn)學(xué)其實(shí)也很簡(jiǎn)單,主要就是以下內(nèi)容
(1)關(guān)于C語(yǔ)言中bool類型
在C99之前C語(yǔ)言是沒有bool類型的,在C00之后引入了_Bool類型,它處于頭文件stdbool.h中
#include <windows.h> #include <stdio.h> #include <stdbool.h>int main() {bool ret = false;ret = true;printf("%d\n", sizeof(ret));//在vs中為1return 0; }源碼中顯示就是一個(gè)宏定義
// // stdbool.h // // Copyright (c) Microsoft Corporation. All rights reserved. // // The C Standard Library <stdbool.h> header. // #ifndef _STDBOOL #define _STDBOOL#define __bool_true_false_are_defined 1#ifndef __cplusplus#define bool _Bool #define false 0 #define true 1#endif /* __cplusplus */#endif /* _STDBOOL *//** Copyright (c) 1992-2010 by P.J. Plauger. ALL RIGHTS RESERVED.* Consult your license regarding permissions and restrictions. V5.30:0009 */(2)float與“零值”的比較
使用if進(jìn)行浮點(diǎn)數(shù)比較時(shí),下面的代碼正確嗎?按照道理1.0-0.9=0.1,應(yīng)該是正確的
int main() {double x = 1.0;double y = 0.1;if ((x - 0.9) == y){printf("correct\n");}else{printf("wrong\n");}return 0; }但實(shí)際結(jié)果卻是:
為什么會(huì)這樣呢,其實(shí)這涉及到的的浮點(diǎn)數(shù)如何在計(jì)算機(jī)中存儲(chǔ)的問(wèn)題,詳細(xì)細(xì)節(jié)請(qǐng)移步:
- (計(jì)算機(jī)組成原理)第二章數(shù)據(jù)的表示和運(yùn)算-第三節(jié)1:浮點(diǎn)數(shù)的表示
其實(shí)如果你打印出來(lái)后,你會(huì)發(fā)現(xiàn)兩者根本不相等,精度丟失
既然浮點(diǎn)數(shù)比較時(shí)不能直接使用“==”,那么應(yīng)該怎么辦呢?
比較時(shí),有點(diǎn)像高等數(shù)學(xué)中的取極限,δ\deltaδ可以被視為一個(gè)誤差范圍,這個(gè)δ\deltaδ需要你自己定義,當(dāng)兩者的絕對(duì)值之差小于該范圍時(shí),C語(yǔ)言就認(rèn)定他們相等,否則不相等
int main() {double x = 1.0;double y = 0.1;if (fabs((1.0 - 0.9)-0.1) < CMP){printf("correct\n");}else{printf("wrong\n");}return 0; }這里的δ\deltaδ其實(shí)C語(yǔ)言已經(jīng)幫我們定義好了,處在float.h頭文件之下
#define DBL_EPSILON 2.2204460492503131e-016 /* smallest such that 1.0+DBL_EPSILON !=1.0 */ #define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON !=1.0 */回歸到主題,如果0被定義為了浮點(diǎn)數(shù),我們要判斷某個(gè)數(shù)是否是0的話可以這樣寫
int main() {double x = 0;if (fabs(x) < DBL_EPSILON)//注意不要寫成<={printf("x是0\n");}else{printf("x不是0\n");}return 0; }(3)if和else的匹配問(wèn)題
這是一個(gè)老生常談的話題。下面代碼看似會(huì)輸出“2”,但實(shí)際什么都不會(huì)輸出
int main() {int x = 0;int y = 1;if (10 == x)if (11 == y)printf("1\n");elseprintf("2\n");return 0;}這屬于代碼風(fēng)格問(wèn)題,else匹配采用的是就近原則
七:switch-case組合
第一: switch case的基本語(yǔ)法結(jié)構(gòu)
switch(整型變量/常量/整型表達(dá)式)//注意只能這三種 {case var1://判斷在這里break;case var2:break;case var3:break;default:break; }其中case完成的判斷功能,break完成的是分支功能,所以如果忘記寫break,就會(huì)導(dǎo)致擊穿現(xiàn)象
第二: 注意一個(gè)語(yǔ)法細(xì)節(jié),就是case里面如果要定義變量的話,必須加花括號(hào)
int main() {int num = 0;scanf("%d", &num);switch (num){case 1:{int a = 1;//注意花括號(hào)printf("first\n");break;}case 2:printf("second\n");break;case 3:printf("third\n");break;default:printf("other\n");break;}}第三: 多條件匹配時(shí)可以這樣寫
int main() {int num = 0;scanf("%d", &num);switch (num){case 1:case 2:case 3:printf("first\n");break;case 4:case 5:printf("second\n");break;default:printf("other\n");break;} }第四: 注意default可以放在任意位置
第五: switch中可以使用return語(yǔ)句,但不建議使用
八:do 、while 、for關(guān)鍵字
第一: 這三種循環(huán)基本語(yǔ)法如下
//while 條件初始化 while(條件判定){//業(yè)務(wù)更新條件更新 }//for for(條件初始化; 條件判定; 條件更新){//業(yè)務(wù)代碼 }//do while 條件初始化 do{條件更新}while(條件判定)第二: 三種循環(huán)對(duì)應(yīng)的死循環(huán)寫法如下
while(1){ }for(;;){ }do{ }while(1);第三: break是跳出該循環(huán),continue是結(jié)束一次循環(huán)
int main() {while (1){int c = getchar();if (c == '#'){break;//表示接受到“#”就結(jié)束}putchar(c);} } int main() {while (1){int c = getchar();if (c == '#'){continue;//表示接受到“#”略過(guò)}putchar(c);} }
這里需要注意for循環(huán)的continue,經(jīng)常愛考察。for循環(huán)在continue時(shí)是跳到循環(huán)更新處
第四: for循環(huán)區(qū)間建議是前閉后開
九:goto關(guān)鍵字
第一: goto基本控制邏輯或者基本語(yǔ)法如下
int main() {int i = 0; START:printf("[%d]goto running ... \n", i);Sleep(1000);++i;if (i < 10){goto START;}printf("goto end ... \n");return 0; }十:void關(guān)鍵字
第一: void是不能用來(lái)定義變量的。因?yàn)槎x變量的本質(zhì)就是開辟內(nèi)存空間,而void作為空類型是不應(yīng)該開辟空間的,即使開辟了空間,也僅僅作為一個(gè)占位符來(lái)看待,所以這種行為直接就會(huì)被編譯器禁止
第二: 首先說(shuō)明一點(diǎn),在C語(yǔ)言中函數(shù)是可以不帶返回值的,返回類型為整型
的確在有些場(chǎng)景中我們是不需要函數(shù)的返回值的,但如果采用上面的那種方式書寫,很容易產(chǎn)生閱讀上的歧義,因此如果函數(shù)不想讓其返回,可以用void,這里一定要將其理解為一種占位符,它是告知用戶和編譯器的
第二: 在如下情形中,編譯器是不會(huì)報(bào)錯(cuò)的,因此會(huì)有很大的安全隱患
而如果限制void后,編譯器將會(huì)報(bào)警。因此void可以充當(dāng)函數(shù)的形參列表,用于告知編譯器和用戶該函數(shù)不需要傳入?yún)?shù)
第四: void的確不可以定義變量,但是void*可以,因?yàn)橹羔樧兞康拇笮∈敲鞔_的(Windows32位下為4個(gè)字節(jié)大小)
void* p=nullptr;第五: void*可以被任何類型的指針接受,void*也可以接受任意指針類型
int main() {void* p = NULL;int* x = NULL;double* y = NULL;p = x;//void*接受int*p = y;//void*接受double* }- 尤其注意 void*也可以接受任意指針類型,這一點(diǎn)通常用作一些通用接口的設(shè)計(jì)
第六: 我們知道,普通類型的指針可以進(jìn)行位運(yùn)算
int* p=NULL; p++; p--;而對(duì)于void*呢?要視平臺(tái)而定,一般VS下不可以,Linux下可以(Linux認(rèn)為void是1)
十一:return關(guān)鍵字
第一:return不可以返回指向“棧內(nèi)存”的指針,因?yàn)樵诤瘮?shù)體結(jié)束時(shí)會(huì)被自動(dòng)銷毀
因此下面的語(yǔ)句會(huì)出現(xiàn)亂碼
char* show() {char str[] = "hello world";return str; } int main() {char* s = show();printf("%s\n", s);return 0; }第二: 函數(shù)的返回值,通過(guò)寄存器的方式,返回給函數(shù)的調(diào)用方(注意區(qū)別上面,上面不能那樣做,因?yàn)槟鞘侵赶驐5闹羔?#xff09;
int GetData() {int x = 0x11223344;printf("running\n");return x; }int main() {int y = GetData();printf("return value:%x\n", y);return 0; }return x對(duì)應(yīng)的匯編代碼為:
十二:const關(guān)鍵字
第一: const修飾的變量不可以直接被修改
const int a=10; a=20;//錯(cuò)誤但間接可以修改
int main() {const int a = 10;int* p = &a;printf("change before:%d\n", a);*p = 20;printf("change after:%d\n", a);return 0; }那么既然這樣其意義何在呢?其實(shí)const修飾變量主要有下面兩個(gè)目的
真正意義上的不可修改如C語(yǔ)言中的常量字符串
int main() {char* str = "hello world\n";//常量字符串*str ='E';return 0; }第二: const int i 和int const i是等價(jià)的
第三: const修飾的變量同樣不能作為數(shù)組定義的一部分(標(biāo)準(zhǔn)C不可以,但是在Linux可以)
int main() {const int n = 100;int arr[n];//錯(cuò)誤return 0; }第四: const在定義時(shí)必須初始化
第五: 建立只讀數(shù)組可以這樣寫
int const a[5]={1,2,3,4,5}; 或 const int a[5]={1,2,3,4,5};第六 :const放在誰(shuí)后面就修飾誰(shuí),因此它與指針的關(guān)系如下
①:const int* i 與int const* i等價(jià)
其中i是指針,const修飾了int,表示指針可以變化,但是指針指向內(nèi)容不能被修改
②:int* const i
const修飾的是指針,所以指針不可變,但是指向的內(nèi)容可變
③:const int* const i=&a
表示指針不可以變,指向的內(nèi)容也不可以變
第七: const 也可以用來(lái)修飾函數(shù)參數(shù),表明不可更改
void show(const int* _p)//防止指針指向內(nèi)容被修改 {printf("value:%d\n", *_p);*_p = 20;//非法操作 }int main() {int a = 10;int* p = &a;show(p); }十三:volatile關(guān)鍵字
有關(guān)volatile關(guān)鍵字的作用在下面這篇文章中有詳細(xì)介紹,請(qǐng)移步
- Linux系統(tǒng)編程34:進(jìn)程信號(hào)之可重入函數(shù),volatile關(guān)鍵字的作用和SIGHLD
volatile關(guān)鍵字的作用:volatile將保持內(nèi)存的可見性,一個(gè)變量一旦被volatile修飾,那么系統(tǒng)總是會(huì)從內(nèi)存中讀取數(shù)據(jù),而不是從寄存器
需要注意const和volatile的區(qū)別,兩者并不矛盾
- const要求你不要進(jìn)行寫入
- volatile意思是你讀的時(shí)候每次要從內(nèi)存讀
十四:extern關(guān)鍵字
extern關(guān)鍵字這里就多說(shuō)了,非常簡(jiǎn)單
十五:struct關(guān)鍵字
第一: struct基本介紹
定義
初始化(不能初始化后整體賦值)
成員訪問(wèn)
結(jié)構(gòu)體傳參
第二: 在Linux中空結(jié)構(gòu)體的大小為0
第三: 柔性數(shù)組
我們知道C語(yǔ)言中是不能有這樣的操作的,就是用變量對(duì)數(shù)組進(jìn)行初始化
int main() {int i=0;scanf("%d",&i);int arr[i]; }在C語(yǔ)言中如果要完成動(dòng)態(tài)數(shù)組,可以借助柔性數(shù)組。使用柔性數(shù)組時(shí),我們采用結(jié)構(gòu)體的方式,將一個(gè)數(shù)組作為結(jié)構(gòu)體成員放置于其中,但注意該數(shù)組不初始化,什么都不寫
在上述結(jié)構(gòu)體中,有兩個(gè)結(jié)構(gòu)體變量,數(shù)組似乎不占空間,但其實(shí)不然。實(shí)則,該結(jié)構(gòu)體將其所占空間劃分為兩部分,一部分就是那個(gè)整形,一部分用于動(dòng)態(tài)開辟,以此滿足數(shù)組的動(dòng)態(tài)變化
既然是柔性,那就可以修改,使用realloc修改
十六:Union關(guān)鍵字
第一: Union是什么
聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間,聯(lián)合體內(nèi)所有成員的起始地址都是一樣的,每個(gè)成員都認(rèn)為它是聯(lián)合體的第一個(gè)成員
第二: 根據(jù)內(nèi)存地址分布,如下,b永遠(yuǎn)定義在相對(duì)于a的低地址處
union Un {int a;int b; };根據(jù)這一性質(zhì)我們可以利用聯(lián)合體來(lái)判斷機(jī)器是大端機(jī)還是小端機(jī),如下
union Un {int a;char b; }; int main() {union Un u;u.a = 1;if (u.b == 1){printf("小端機(jī)\n");}else {printf("大端機(jī)\n");}return 0; }這是因?yàn)?br />
十七:enum關(guān)鍵字
enum用于枚舉一堆常量,就像Excel中的數(shù)據(jù)有效性,它規(guī)定了數(shù)據(jù)的取值類型,比如說(shuō)男性它只有男或女
定義
enum color是枚舉類型,括號(hào)中的內(nèi)容是枚舉類型的可能取值,也叫做枚舉常量。這些可能取值實(shí)際上是有值的,默認(rèn)是從0開始的
當(dāng)然是可以修改的
枚舉的這樣的寫法其實(shí)和宏的寫法在代碼的邏輯上是相似的
十八:typedef關(guān)鍵字
第一: typedef的作用就是為類型重新命名
typedef unsigned int u_int;int main() {u_int a = 10;return 0; }
typedef 經(jīng)常會(huì)在結(jié)構(gòu)體重命名里
第二: 大家一定要對(duì)typedef理解到位,如下
int main() {int* a, b;//a是指針類型//b是整形 }typedef從某種方面可以理解一種全新的類型,因此下面的*就不存在和誰(shuí)結(jié)合的問(wèn)題了
typedef int* int_p;int main() {int_p a, b;//a是指針類型//b也是指針類型 }而對(duì)于#define而言它就是一種文本替換了,因此
#define int_p int*int main() {int_p a, b;//a是指針類型//b是整形 }第三:使用typedef定義后的新類型,不能配合其他關(guān)鍵字使用
#define INT_DE int typedef int INT_TY;int main() {unsigned INT_DE a;//正確unsigned INT_TY b;//錯(cuò)誤 }總結(jié)
(1)關(guān)鍵字分類
數(shù)據(jù)類型關(guān)鍵字 :
- char
- short
- int
- long
- signed
- unsigned
- float
- double
- struct
- union
- enum
- void
控制語(yǔ)句關(guān)鍵字 :
1:循環(huán)控制
- for
- do
- while
- break
- continue
2:條件語(yǔ)句
- if
- else
- goto
3:開關(guān)語(yǔ)句
- switch
- case
- default
4:返回語(yǔ)句
- return
存儲(chǔ)類型關(guān)鍵字 :
- auto
- extern
- register
- static
- typedef
這里需要補(bǔ)充一點(diǎn):使用typedef時(shí)不能同時(shí)出現(xiàn)多個(gè)存儲(chǔ)關(guān)鍵字
typedef static int//錯(cuò)誤 typedef register int//錯(cuò)誤其他關(guān)鍵字 :
- const
- sizeof
- volatile
總結(jié)
以上是生活随笔為你收集整理的【C语言重点难点精讲】关键字精讲的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。