日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【C语言重点难点精讲】关键字精讲

發(fā)布時(shí)間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C语言重点难点精讲】关键字精讲 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

必讀

  • C語言關(guān)鍵字是一個非常重要的話題,因?yàn)樗茉谙喈?dāng)?shù)某潭壬蠈語言的核心內(nèi)容串聯(lián)起來,起到一種提綱挈領(lǐng)的效果
  • 下面的內(nèi)容重點(diǎn)提及的是相應(yīng)關(guān)鍵字特別值得注意的地方,這些地方是我們經(jīng)常忽略的,而且考試也會經(jīng)常涉及到
  • 講解這些關(guān)鍵字時(shí)默認(rèn)大家都有C語言的基礎(chǔ),因此不會從0開始談起

文章目錄

  • 一:auto關(guān)鍵字
  • 二:register關(guān)鍵字
    • (1)存儲器分級
    • (2)register修飾變量
  • 三:static關(guān)鍵字
    • (1)修飾全局變量和函數(shù)
    • (2)修飾局部變量
  • 四:sizeof關(guān)鍵字
  • 五:signed、unsigned關(guān)鍵字
  • 六:if、else
    • (1)關(guān)于C語言中bool類型
    • (2)float與“零值”的比較
    • (3)if和else的匹配問題
  • 七: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)鍵字分類

一般來講,C語言一共有32個關(guān)鍵字(C90標(biāo)準(zhǔn)),當(dāng)然C99后又新增了5個關(guān)鍵字,不過我們還是重點(diǎn)討論這32個關(guān)鍵字

關(guān)鍵字說明
auto聲明自動變量
short聲明短整型變量或函數(shù)
int聲明整形變量或函數(shù)
long聲明長整形變量或函數(shù)
float聲明浮點(diǎn)型變量或函數(shù)
double聲明雙精度變量或函數(shù)
char聲明字符型變量或函數(shù)
struct聲明結(jié)構(gòu)體變量或函數(shù)
union聲明共用數(shù)據(jù)類型
enum聲明枚舉類型
typedef用以給數(shù)據(jù)類型取別名
const聲明只讀變量
unsigned聲明無符號類型變量或函數(shù)
signed聲明有符號類型變量或函數(shù)
extern聲明變量是在其它文件中正聲明
register聲明寄存器變量
static聲明靜態(tài)變量
volatile說明變量在程序執(zhí)行過程中可以被隱含地改變
void聲明函數(shù)無返回值或無參數(shù),聲明無類型指針
if條件語句
else條件語句否定分支(與if連用)
switch用于開關(guān)語句
case開關(guān)語句分支
for一種循環(huán)語句
do循環(huán)語句的循環(huán)體
while循環(huán)語句的循環(huán)條件
goto無條件跳轉(zhuǎn)語句
continue結(jié)束當(dāng)前循環(huán),開始下一輪循環(huán)
break跳出當(dāng)前循環(huán)
default開關(guān)語句中的“其它”分支
sizeof計(jì)算數(shù)據(jù)類型長度
return子程序返回語句,循環(huán)條件

一:auto關(guān)鍵字

一般來說,在代碼塊中定義的變量(也即局部變量),默認(rèn)都是auto修飾的,不過會省略。但是一定要注意:不是說默認(rèn)的所有變量都是auto的,它只是一般用來修飾局部變量

當(dāng)然在C語言中,我們已經(jīng)不再使用auto了,或者稱其為過時(shí)了,但是在C++中卻賦予了auto新的功能,它變得更加強(qiá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)存儲器分級

這個概念我們在計(jì)算機(jī)組成原理中講得已經(jīng)非常詳細(xì)了,請點(diǎn)擊:(計(jì)算機(jī)組成原理)第三章存儲系統(tǒng)-第一節(jié):存儲器分類、多級存儲系統(tǒng)和存儲器性能指標(biāo)

(2)register修飾變量

可以看出,如果將變量放到寄存器中,那么效率就會提高。可以用register修飾的變量有以下幾種

  • 局部的(全局變量會導(dǎo)致CPU寄存器長時(shí)間被占用)
  • 不會被寫入的(寫入的話就需要被寫回內(nèi)存,要是這樣的話register就沒有意義的)
  • 高頻需要被讀取的

如果要使用,不要大量使用,因?yàn)榧拇嫫鞯臄?shù)量有限。

另外還需要注意的一點(diǎn)是:被register修飾的變量,是不能取地址的,因?yàn)樗呀?jīng)放在了寄存器中,地址會涉及到內(nèi)存,但是可以被寫入
當(dāng)然這個register關(guān)鍵字現(xiàn)在也基本不會用了,因?yàn)槿缃竦木幾g器優(yōu)化已經(jīng)很智能了,不需要你自己手動優(yōu)化

三:static關(guān)鍵字

(1)修飾全局變量和函數(shù)

我們知道全局變量(加入關(guān)鍵字extern聲明)和函數(shù)都可以跨文件使用的

但是有一些應(yīng)用場景中,我們不想讓全局變量或函數(shù)跨文件訪問應(yīng)該怎么辦呢?那么就可以使用static關(guān)鍵字

static int g_value=100;//修飾staic后全局變量將不能跨文件使用


可以看出被static修飾的全局變量是不能被外部其他文件直接訪問的,而只能在本文件內(nèi)使用

  • 需要注意這里說的是直接訪問,那意味著可以間接訪問,比如通過函數(shù)的方式實(shí)現(xiàn)

同樣,被static修飾的函數(shù)只能在本文件內(nèi)訪問,而不能在外部其它文件中直接訪問

  • 還是需要注意,這里是不能直接訪問,并不是不能訪問,比如可以通過函數(shù)嵌套的方式

static這種功能本質(zhì)為了封裝,因?yàn)槲覀兛梢园岩恍┎恍枰蛘卟幌胍┞兜募?xì)節(jié)保護(hù)起來了,只提供一個功能函數(shù)個,該函數(shù)在內(nèi)部調(diào)用它們即可,這樣的話代碼安全性也比較高

(2)修飾局部變量

我們知道全局變量僅在當(dāng)前代碼塊內(nèi)有效,代碼塊結(jié)束之后局部變量會自動釋放空間,因此下面代碼的結(jié)果就會是這樣

如果使用static修飾局部變量,會更改其生命周期,但其作用域不變,如下當(dāng)用static修飾后,變量i地址不變,且結(jié)果累加

static為什么可以更改局部變量的生命周期呢?因?yàn)楸籹tatic修飾的變量會將其從棧區(qū)移動到數(shù)據(jù)段,當(dāng)然這就涉及到了C/C++地址空間的問題了

查看實(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("第一個環(huán)境變量的地址:%p,十進(jìn)制為:%d\n",env[0],env[0]);printf("\n"); }

四:sizeof關(guān)鍵字

sizeof用于確定一種類型對應(yīng)在開辟空間的時(shí)候的大小,注意它是關(guān)鍵字而不是函數(shù)

它的基本用法就是下面這樣,這我就不再多說了(注意Windows32位平臺)

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)為是錯誤的,而考試就愛給你整這些犄角旮旯的東西

int main() {int a = 10;第一種:cout << sizeof(a) << endl;第二種:cout << sizeof(int) << endl;第三種:cout << sizeof a << endl;//這種寫法其實(shí)也證明了sizeof不是函數(shù)cout << sizeof int << endl;//注意這種寫法是錯誤的 }

五:signed、unsigned關(guān)鍵字

這一部分需要涉及數(shù)據(jù)存儲及原碼反碼等基礎(chǔ)概念,請參照以下章節(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只是對數(shù)據(jù)的一種解讀方式,其中signed會把首位數(shù)據(jù)解讀為符號位,符號位用于標(biāo)識其正負(fù),unsigned的首位也算作數(shù)據(jù)位,也就是說類型決定了其讀寫的時(shí)候的解釋方式
因此像下面的這樣一句代碼,看似不合適,但是它是沒有問題的,因?yàn)榇鎯r(shí)對于變量a它只關(guān)心我所開辟的空間上的二進(jìn)制數(shù)據(jù)放進(jìn)了沒有,并不關(guān)心你之前是怎么樣的

unsigned int b=-10; -10的原碼:1000 0000 0000 0000 0000 0000 0000 1010 -10的反碼:1111 1111 1111 1111 1111 1111 1111 0101 -10的補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 0110

也就是說b里面的存儲的內(nèi)容會按照不同的解釋方式而變化

第二點(diǎn): signed和unsigned也是相關(guān)C語言考試的重點(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是無符號整形,因此在與0比較的時(shí)候,不會小于0,所以會死循環(huán),并且打印時(shí)從9開始減小到0,然后接著是42億多,然后依次減小,最后再到0

第三點(diǎn):使用unsigned時(shí)初始化變量時(shí),建議帶上u,也即

unsigned int b=10u;

六:if、else

if和else如果簡單點(diǎn)學(xué)其實(shí)也很簡單,主要就是以下內(nèi)容

  • 0為表示假,非0表示真
  • if語句執(zhí)行時(shí),必然是先執(zhí)行“()”里面的表達(dá)式或者是函數(shù),得到真假后,然后進(jìn)行判定,再進(jìn)行分支功能
  • (1)關(guān)于C語言中bool類型

    在C99之前C語言是沒有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; }

    源碼中顯示就是一個宏定義

    // // 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é)果卻是:

    為什么會這樣呢,其實(shí)這涉及到的的浮點(diǎn)數(shù)如何在計(jì)算機(jī)中存儲的問題,詳細(xì)細(xì)節(jié)請移步:

    • (計(jì)算機(jī)組成原理)第二章數(shù)據(jù)的表示和運(yùn)算-第三節(jié)1:浮點(diǎn)數(shù)的表示

    其實(shí)如果你打印出來后,你會發(fā)現(xiàn)兩者根本不相等,精度丟失


    既然浮點(diǎn)數(shù)比較時(shí)不能直接使用“==”,那么應(yīng)該怎么辦呢?

    比較時(shí),有點(diǎn)像高等數(shù)學(xué)中的取極限,δ\deltaδ可以被視為一個誤差范圍,這個δ\deltaδ需要你自己定義,當(dāng)兩者的絕對值之差小于該范圍時(shí),C語言就認(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語言已經(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ù),我們要判斷某個數(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的匹配問題

    這是一個老生常談的話題。下面代碼看似會輸出“2”,但實(shí)際什么都不會輸出

    int main() {int x = 0;int y = 1;if (10 == x)if (11 == y)printf("1\n");elseprintf("2\n");return 0;}

    這屬于代碼風(fēng)格問題,else匹配采用的是就近原則

    七:switch-case組合

    第一: switch case的基本語法結(jié)構(gòu)

    switch(整型變量/常量/整型表達(dá)式)//注意只能這三種 {case var1://判斷在這里break;case var2:break;case var3:break;default:break; }

    其中case完成的判斷功能,break完成的是分支功能,所以如果忘記寫break,就會導(dǎo)致擊穿現(xiàn)象

    第二: 注意一個語法細(xì)節(jié),就是case里面如果要定義變量的話,必須加花括號

    int main() {int num = 0;scanf("%d", &num);switch (num){case 1:{int a = 1;//注意花括號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語句,但不建議使用

    八:do 、while 、for關(guān)鍵字

    第一: 這三種循環(huán)基本語法如下

    //while 條件初始化 while(條件判定){//業(yè)務(wù)更新條件更新 }//for for(條件初始化; 條件判定; 條件更新){//業(yè)務(wù)代碼 }//do while 條件初始化 do{條件更新}while(條件判定)

    第二: 三種循環(huán)對應(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;//表示接受到“#”略過}putchar(c);} }


    這里需要注意for循環(huán)的continue,經(jīng)常愛考察。for循環(huán)在continue時(shí)是跳到循環(huán)更新處

    int main() {int i = 0;for (; i < 10; i++){printf("continue before:%d\n", i);if (i == 5) {printf("continue語句之前\n");continue;printf("continue語句之后\n");}printf("continue after:%d\n", i);} }


    第四: for循環(huán)區(qū)間建議是前閉后開

    for(int i=0;i<10;i++) {//循環(huán)10次 } for(int i=6;i<10;i++) {//循環(huán)10-6=4次 }

    九:goto關(guān)鍵字

    第一: goto基本控制邏輯或者基本語法如下

    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是不能用來定義變量的。因?yàn)槎x變量的本質(zhì)就是開辟內(nèi)存空間,而void作為空類型是不應(yīng)該開辟空間的,即使開辟了空間,也僅僅作為一個占位符來看待,所以這種行為直接就會被編譯器禁止

    第二: 首先說明一點(diǎn),在C語言中函數(shù)是可以不帶返回值的,返回類型為整型

    的確在有些場景中我們是不需要函數(shù)的返回值的,但如果采用上面的那種方式書寫,很容易產(chǎn)生閱讀上的歧義,因此如果函數(shù)不想讓其返回,可以用void,這里一定要將其理解為一種占位符,它是告知用戶和編譯器的

    第二: 在如下情形中,編譯器是不會報(bào)錯的,因此會有很大的安全隱患

    而如果限制void后,編譯器將會報(bào)警。因此void可以充當(dāng)函數(shù)的形參列表,用于告知編譯器和用戶該函數(shù)不需要傳入?yún)?shù)

    第四: void的確不可以定義變量,但是void*可以,因?yàn)橹羔樧兞康拇笮∈敲鞔_的(Windows32位下為4個字節(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--;

    而對于void*呢?要視平臺而定,一般VS下不可以,Linux下可以(Linux認(rèn)為void是1)

    十一:return關(guān)鍵字

    第一return不可以返回指向“棧內(nèi)存”的指針,因?yàn)樵诤瘮?shù)體結(jié)束時(shí)會被自動銷毀

    因此下面的語句會出現(xiàn)亂碼

    char* show() {char str[] = "hello world";return str; } int main() {char* s = show();printf("%s\n", s);return 0; }

    第二: 函數(shù)的返回值,通過寄存器的方式,返回給函數(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對應(yīng)的匯編代碼為:

    十二:const關(guān)鍵字

    第一: const修飾的變量不可以直接被修改

    const int a=10; a=20;//錯誤

    但間接可以修改

    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修飾變量主要有下面兩個目的

  • 讓編譯器進(jìn)行直接修改式檢查
  • 告訴其他人這個變量不要改動,屬于“自描述”含義
  • 真正意義上的不可修改如C語言中的常量字符串

    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];//錯誤return 0; }

    第四: const在定義時(shí)必須初始化

    第五: 建立只讀數(shù)組可以這樣寫

    int const a[5]={1,2,3,4,5};const int a[5]={1,2,3,4,5};

    第六 :const放在誰后面就修飾誰,因此它與指針的關(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 也可以用來修飾函數(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ì)介紹,請移步

    • Linux系統(tǒng)編程34:進(jìn)程信號之可重入函數(shù),volatile關(guān)鍵字的作用和SIGHLD

    volatile關(guān)鍵字的作用:volatile將保持內(nèi)存的可見性,一個變量一旦被volatile修飾,那么系統(tǒng)總是會從內(nèi)存中讀取數(shù)據(jù),而不是從寄存器

    需要注意const和volatile的區(qū)別,兩者并不矛盾

    • const要求你不要進(jìn)行寫入
    • volatile意思是你讀的時(shí)候每次要從內(nèi)存讀

    十四:extern關(guān)鍵字

    extern關(guān)鍵字這里就多說了,非常簡單

    十五:struct關(guān)鍵字

    第一: struct基本介紹

    定義

    初始化(不能初始化后整體賦值)


    成員訪問

    結(jié)構(gòu)體傳參

    第二: 在Linux中空結(jié)構(gòu)體的大小為0

    第三: 柔性數(shù)組

    我們知道C語言中是不能有這樣的操作的,就是用變量對數(shù)組進(jìn)行初始化

    int main() {int i=0;scanf("%d",&i);int arr[i]; }

    在C語言中如果要完成動態(tài)數(shù)組,可以借助柔性數(shù)組。使用柔性數(shù)組時(shí),我們采用結(jié)構(gòu)體的方式,將一個數(shù)組作為結(jié)構(gòu)體成員放置于其中,但注意該數(shù)組不初始化,什么都不寫

    在上述結(jié)構(gòu)體中,有兩個結(jié)構(gòu)體變量,數(shù)組似乎不占空間,但其實(shí)不然。實(shí)則,該結(jié)構(gòu)體將其所占空間劃分為兩部分,一部分就是那個整形,一部分用于動態(tài)開辟,以此滿足數(shù)組的動態(tài)變化
    既然是柔性,那就可以修改,使用realloc修改

    十六:Union關(guān)鍵字

    第一: Union是什么
    聯(lián)合也是一種特殊的自定義類型 這種類型定義的變量也包含一系列的成員,特征是這些成員公用同一塊空間,聯(lián)合體內(nèi)所有成員的起始地址都是一樣的,每個成員都認(rèn)為它是聯(lián)合體的第一個成員

    第二: 根據(jù)內(nèi)存地址分布,如下,b永遠(yuǎn)定義在相對于a的低地址處

    union Un {int a;int b; };

    根據(jù)這一性質(zhì)我們可以利用聯(lián)合體來判斷機(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ù)的取值類型,比如說男性它只有男或女

    定義

    enum color是枚舉類型,括號中的內(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)常會在結(jié)構(gòu)體重命名里

    typedef struct stu {int a;int b; }Student;int main() {Student student1; }

    第二: 大家一定要對typedef理解到位,如下

    int main() {int* a, b;//a是指針類型//b是整形 }

    typedef從某種方面可以理解一種全新的類型,因此下面的*就不存在和誰結(jié)合的問題了

    typedef int* int_p;int main() {int_p a, b;//a是指針類型//b也是指針類型 }

    而對于#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;//錯誤 }

    總結(jié)

    (1)關(guān)鍵字分類

    數(shù)據(jù)類型關(guān)鍵字

    • char
    • short
    • int
    • long
    • signed
    • unsigned
    • float
    • double
    • struct
    • union
    • enum
    • void

    控制語句關(guān)鍵字
    1:循環(huán)控制

    • for
    • do
    • while
    • break
    • continue

    2:條件語句

    • if
    • else
    • goto

    3:開關(guān)語句

    • switch
    • case
    • default

    4:返回語句

    • return

    存儲類型關(guān)鍵字

    • auto
    • extern
    • register
    • static
    • typedef

    這里需要補(bǔ)充一點(diǎn):使用typedef時(shí)不能同時(shí)出現(xiàn)多個存儲關(guān)鍵字

    typedef static int//錯誤 typedef register int//錯誤

    其他關(guān)鍵字

    • const
    • sizeof
    • volatile

    總結(jié)

    以上是生活随笔為你收集整理的【C语言重点难点精讲】关键字精讲的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。