本章內(nèi)容是初始C語(yǔ)言的最后一節(jié),后續(xù)會(huì)逐一創(chuàng)作更詳細(xì)的文章
1. 操作符本節(jié)簡(jiǎn)單介紹幾種操作符,后續(xù)會(huì)出文章細(xì)說(shuō)
操作符可以分為以下幾類(lèi):
算術(shù)運(yùn)算符中/和%值得注意
/如果兩個(gè)操作數(shù)都是整數(shù),那么結(jié)果是兩個(gè)整數(shù)相除的商,比如6/5=1
想要得到小數(shù),兩操作數(shù)至少有一個(gè)是小數(shù),6.0/5=1.2
%兩操作數(shù)必須是整數(shù),結(jié)果為兩數(shù)相除后的余數(shù),
余數(shù)符號(hào)和分子相同
(-3) % 5 = -3
3% (-5) = 3
單目運(yùn)算符中的++前置和++后置注意區(qū)分(--類(lèi)似,以++舉例)
#includeint main()
{int a = 2;
int b = a++;
printf("%d\n", b);//2
printf("%d\n", a);//3
a = 2;
b = ++a;
printf("%d\n", b);//3
printf("%d\n", a);//3
return 0;
}
前置++表示先自增,在引用
后置++表示先引用,在自增
注:[] . ->操作符在本文后續(xù)會(huì)介紹,與位有關(guān)的操作符后面會(huì)出文章細(xì)說(shuō)
前面我們介紹變量時(shí)說(shuō)過(guò)變量的命名不能用關(guān)鍵字,那么C語(yǔ)言都有哪些關(guān)鍵字呢?
C語(yǔ)言常用的關(guān)鍵字有
數(shù)據(jù)類(lèi)型:
1.內(nèi)置類(lèi)型:char short int float long double ,long long ,long double,void
2.構(gòu)造類(lèi)型:enum ,struct,union
3.其他:const extern signed unsigned
存儲(chǔ)類(lèi)型:auto static register
循環(huán):while do for continue break
選擇:if else switch case default break
特殊:sizeof return goto typedef volatile
2.1 typedef關(guān)鍵字typedef亦為類(lèi)型定義,也可以稱(chēng)類(lèi)型重定義,類(lèi)型替換
當(dāng)某種類(lèi)型名比較復(fù)雜,用typedef可以簡(jiǎn)化類(lèi)型名稱(chēng)
通常用typedef重定義結(jié)構(gòu)體類(lèi)型
在C語(yǔ)言中:
static是用來(lái)修飾變量和函數(shù)的
1. 修飾局部變量-稱(chēng)為靜態(tài)局部變量
2. 修飾全局變量-稱(chēng)為靜態(tài)全局變量
3. 修飾函數(shù)-稱(chēng)為靜態(tài)函數(shù)
2.2.1 修飾局部變量改變局部變量的生命周期
無(wú)static定義
static定義
說(shuō)明static修飾局部變量改變變量的生命周期,離開(kāi)test函數(shù)時(shí)a不會(huì)銷(xiāo)毀。
所以下次調(diào)用test函數(shù)時(shí)不會(huì)創(chuàng)建變量a,更不會(huì)初始化。
2.2.2 修飾全局變量無(wú)static定義
static定義
報(bào)錯(cuò)為無(wú)法解析g_val
說(shuō)明此時(shí)全局變量不具有外部鏈接屬性
2.2.3 修飾函數(shù)無(wú)static定義
static定義
可以看出來(lái) static修飾函數(shù)使函數(shù)只能在當(dāng)前的源文件中引用該函數(shù)
2.2.4 總結(jié)1.修飾局部變量,改變局部變量的存儲(chǔ)方式(堆存儲(chǔ)變?yōu)閿?shù)據(jù)段存儲(chǔ)),體現(xiàn)為生命周期變長(zhǎng)
2.修飾全局變量,改變?nèi)肿兞康逆溄訉傩裕ㄍ獠挎溄幼優(yōu)閮?nèi)部鏈接),體現(xiàn)為作用域變小
3.修飾函數(shù),改變函數(shù)的連接屬性(外部鏈接變?yōu)閮?nèi)部鏈接)
只能在定義函數(shù)的源文件中引用函數(shù)
附C和指針里的總結(jié)
本屆內(nèi)容僅僅簡(jiǎn)單的介紹一下宏定義,后期會(huì)出詳細(xì)的文章與大家探討
#define MAX 100 //定義常量
我們想寫(xiě)a+b的函數(shù)可以這么寫(xiě)
int add(int a, int b)
{return a + b;
}
int main()
{int a = 10, b = 20;
int ret = add(a,b);//運(yùn)行的時(shí)候會(huì)進(jìn)入函數(shù)內(nèi)部并且?guī)С龇祷刂?printf("%d", ret);
return 0;
}
如果我們定義宏可以這么寫(xiě)
#define ADD(a,b) ((a)+(b))
int main()
{int a = 10, b = 20;
int ret = ADD(a,b); //編譯的時(shí)候就直接將ADD(a,b)替換成((a)+(b))
pritnf("%d", ret);
return 0;
總結(jié):
1.宏定義是替換,函數(shù)調(diào)用會(huì)進(jìn)入函數(shù)內(nèi)部并且返回值
2.宏定義在編譯的時(shí)候就會(huì)進(jìn)行,函數(shù)調(diào)用程序運(yùn)行時(shí)才會(huì)執(zhí)行
4. 指針在熟悉指針之前我們先來(lái)說(shuō)一下內(nèi)存
4.1 內(nèi)存內(nèi)存是電腦上特別重要的存儲(chǔ)器,計(jì)算機(jī)中程序的運(yùn)行都是在內(nèi)存中進(jìn)行的
任務(wù)管理器中可以看見(jiàn)每個(gè)程序?qū)?nèi)存的占用有多少,當(dāng)程序運(yùn)行時(shí),會(huì)向內(nèi)存中申請(qǐng)存儲(chǔ)空間存儲(chǔ)程序運(yùn)行所需要的相關(guān)數(shù)據(jù)。
打個(gè)比方,每一個(gè)房間都需要空間,而公寓給了每個(gè)房間所需要的空間,內(nèi)存就相當(dāng)于公寓,房間相當(dāng)于各種各樣的數(shù)據(jù),數(shù)據(jù)不同,所占用的空間不同,這也是不同程序所占用內(nèi)存不同的原因
常見(jiàn)的內(nèi)存有4G ,8G ,16G ,32G
現(xiàn)在我們知道,內(nèi)存是存放數(shù)據(jù)的
每個(gè)房間都是獨(dú)立的,用隔板將它們分開(kāi),并且每個(gè)房間都有門(mén)牌號(hào),以便我們可以找到對(duì)應(yīng)的門(mén)戶(hù),因此,對(duì)于內(nèi)存
1.內(nèi)存首先被劃分為一個(gè)個(gè)的內(nèi)存單元
2.內(nèi)存單元有編號(hào)
針對(duì)結(jié)論1,每個(gè)內(nèi)存單元占多大空間?
每個(gè)內(nèi)存單元占1字節(jié)
解釋?zhuān)?br />我們知道存儲(chǔ)容量單位有bit–byte–kb–Mb……而占存儲(chǔ)容量最小的數(shù)據(jù)類(lèi)型是char 需要8bit位,如果選擇bit最為內(nèi)存單元,而每一個(gè)內(nèi)存單元對(duì)應(yīng)一個(gè)編號(hào),一個(gè)char就需要8個(gè)編號(hào),過(guò)于奢侈,如果選擇一個(gè)kb為內(nèi)存單元,那么一個(gè)內(nèi)存單元將可以存放1024個(gè)char數(shù)據(jù),但是只有一個(gè)編號(hào),所以編號(hào)和數(shù)據(jù)不能一一對(duì)應(yīng),綜上,選擇1byte為內(nèi)存單元最合適。
針對(duì)結(jié)論2,內(nèi)存單元是如何編號(hào)的?
內(nèi)存單元的編號(hào)是從32個(gè)0到32個(gè)1(32位)
解釋?zhuān)?br />32位機(jī)器上,有32根地址線(xiàn)
每根地址線(xiàn)在通電情況下有高電頻和低電頻兩種狀態(tài),所以32根地址線(xiàn)全部通電情況下有2^32種狀態(tài),分別是
因而我們將2^32種通電狀態(tài)作為內(nèi)存單元的編號(hào)
32位機(jī)器大內(nèi)存為4G,理由如下:
32位機(jī)器的內(nèi)存單元編號(hào)最多有2^32種,即內(nèi)存最多有2^32個(gè)小單元
,而每一種編號(hào)對(duì)應(yīng)的內(nèi)存單元占一個(gè)字節(jié),所以?xún)?nèi)存共占2^32byte,
1KB=1024byte,1MB=1024KB,1GB=1024MB,2^32字節(jié)剛好就是4GB
同理64位機(jī)器內(nèi)存大為8GB
內(nèi)存單元的編號(hào)等于地址等于指針
指針就是地址,地址就是指針
我們現(xiàn)在來(lái)看程序運(yùn)行時(shí)是怎么使用內(nèi)存的
#includeint main()
{int a = 10;
return 0;
}
我們調(diào)式一下看一下內(nèi)存的分布
內(nèi)存編號(hào)和數(shù)據(jù)內(nèi)容均是十六進(jìn)制顯示
我們?cè)賮?lái)看一下a的地址
a占4個(gè)字節(jié) 我們打印a的地址 屏幕上顯示00EFFE08,
說(shuō)明a的地址是第一個(gè)字節(jié)的地址
4.3 指針變量a中存放的是整數(shù),我們稱(chēng)a為整形變量
&a是一個(gè)指針,所以我們將存放指針的變量稱(chēng)為指針變量
指針變量具有指向性
pa中存放的是a的地址,所以我們可以通過(guò)pa找到a,相當(dāng)于我知道你家地址,我就可以找到你
int * pa
*說(shuō)明pa是指針變量
int說(shuō)明pa所指向的對(duì)象是int類(lèi)型
如何通過(guò)pa找到a?
*pa = 20;//*是解引用操作符,表示通過(guò)pa找到pa所指向的a
同理,指向字符的指針這么定義
4.4 指針變量的大小前面我們使用sizeof求過(guò)基本數(shù)據(jù)類(lèi)型的大小,那么指針的大小是多少呢?
我們發(fā)現(xiàn)指針在32平臺(tái)上的字節(jié)數(shù)都是4個(gè)字節(jié)
這是為什么呢?
指針變量存儲(chǔ)的值是地址,而前面說(shuō)過(guò)內(nèi)存單元的編號(hào)取值為32個(gè)0到32個(gè)1,
即指針的取值為32個(gè)0到32個(gè)1,32個(gè)二進(jìn)制剛好是4個(gè)字節(jié)
對(duì)于64為平臺(tái),64根地址線(xiàn),指針取值為64個(gè)0到64個(gè)1,占8個(gè)字節(jié)
總結(jié):
-` 變量的地址是變量占據(jù)的第一個(gè)字節(jié)地址
前面我們已經(jīng)了解了C語(yǔ)言的基本類(lèi)型
int,char,short,long,long long,float,double,long double
指針類(lèi)型等
但是上述類(lèi)型具有單一性,只能用來(lái)定義只具有一種性質(zhì)的個(gè)體,這是不夠的,對(duì)于描述一個(gè)學(xué)生,我們不能用上述基本類(lèi)型的任意一個(gè)來(lái)定義,因?yàn)閷W(xué)生具有性別、年齡、學(xué)號(hào)等多個(gè)性質(zhì),因而,我們創(chuàng)建了自定義數(shù)據(jù)類(lèi)型,結(jié)構(gòu)體就是其中一種
5.1 結(jié)構(gòu)體的創(chuàng)建struct Stu //創(chuàng)建了一種類(lèi)型,該類(lèi)型屬于自定義類(lèi)型中的結(jié)構(gòu)體類(lèi)型,該類(lèi)型名叫struct Stu
{char name[20];
int age; //{}內(nèi)的所有變量稱(chēng)為結(jié)構(gòu)體成員,也叫做域
char sex[5];
char id[15];
}
struct Stu student1 = {"小紅",10,"女","12345"};
//表示用該類(lèi)型定義了一個(gè)變量并初始化
5.2 引用結(jié)構(gòu)體對(duì)于結(jié)構(gòu)體等有兩個(gè)專(zhuān)屬操作符,分別是->和.
例如,student1過(guò)生日了,年齡增加了一歲,可以這么表示
student1.[age] = student1.[age] + 1;
//student1表示找到需要引用的結(jié)構(gòu)體變量,操作符.表示找到該變量的某個(gè)成員
找到age成員并且讓它加一
當(dāng)我們不知道結(jié)構(gòu)體變量的名字時(shí),但是直到它的地址
struct Stu* ps = &student1;
ps->age = ps->age + 1; //等價(jià)*(ps).[age]
操作符->的做操作數(shù)是針對(duì)指針,表示找到地址值為ps的變量,->表示找到該變量的某個(gè)成員
初始C語(yǔ)言1
初始C語(yǔ)言2
初始C語(yǔ)言3
三篇文章已經(jīng)將C語(yǔ)言的知識(shí)點(diǎn)粗略的介紹的一遍,后續(xù)的文章會(huì)逐一針對(duì)每章內(nèi)容進(jìn)行更深入、詳細(xì)的討論,如果您覺(jué)得哪里寫(xiě)的有問(wèn)題,歡迎指正!
最后:如果您覺(jué)得文章對(duì)您有幫助,請(qǐng)不要吝嗇手中的贊,這對(duì)我來(lái)說(shuō)很重要,也是我繼續(xù)創(chuàng)作的動(dòng)力,謝謝!
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧