1.const
概述
定義只讀變量的關(guān)鍵字。(不要說常量,很業(yè)余)
修飾變量 :被const修飾的變量只有讀屬性。
修飾函數(shù):在C++中用到,表示在這個(gè)成員函數(shù)中不會(huì)修改數(shù)據(jù)成員,如果試圖修改會(huì)報(bào)錯(cuò)。
修飾參數(shù):C\C++中都用到,保證傳入?yún)?shù)的值在函數(shù)體內(nèi)不被修改,如果試圖修改會(huì)報(bào)錯(cuò),增加函數(shù)的健壯性。
修飾返回值:一般修飾指針的偏多,表示函數(shù)的返回值,及指針的內(nèi)容不能被修改。并且返回值只能賦值給別const修飾的同類型指針。
用例
普通變量:
const int a = 10;
int const a = 10; // 兩條語句的效果是一樣的
指針變量:
++++++++++++++++++++++++++
const int * pt1 = &a; //表示內(nèi)存中的值不能修改
*pt1 = 20; //編譯錯(cuò)誤,
pt1 = & b;
++++++++++++++++++++++++++
int * const pt2 = &a; //表示指針指向的地址不能修改
*pt2 = 20;
pt2 = &b; //編譯錯(cuò)誤
++++++++++++++++++++++++++
2.static
概述
static關(guān)鍵字用于修飾靜態(tài)變量。
全局靜態(tài)變量:
1.內(nèi)存中存放的位置:靜態(tài)儲(chǔ)存區(qū),在整個(gè)程序運(yùn)行過程中都存在。
2.初始化:沒有初始化的靜態(tài)全局變量,程序會(huì)自動(dòng)初始化為0。
3.作用域:在聲名它的文件之外是不可用的,從定義或者聲名處到文件結(jié)尾。
局部靜態(tài)變量:
1.內(nèi)存中的存放位置:靜態(tài)儲(chǔ)存區(qū),在整個(gè)程序運(yùn)行過程中都存在。
2.初始化:沒有初始化的全局變量,程序會(huì)自動(dòng)初始化為0。
3.作用域:作用域不變,依舊是定義它的函數(shù)或者語句塊的結(jié)束就結(jié)束了。
全局變量和局部變量能重名嗎?如果能重名那么作用域會(huì)怎么樣?
能重名,局部變量的作用域會(huì)覆蓋全局變量的作用域。類似于就近原則。
補(bǔ)充:static關(guān)鍵字修飾函數(shù)
概述
static關(guān)鍵字修飾的函數(shù)叫靜態(tài)函數(shù),靜態(tài)函數(shù)的作用域只在函數(shù)所在的文件,失去了全局可見性。編譯器只有函數(shù)的入口地址,沒有函數(shù)名。
靜態(tài)函數(shù)的有點(diǎn):
1.靜態(tài)函數(shù)不能被其他文件調(diào)用,增加安全性。
2.其他文件中可以定義同名的函數(shù),不會(huì)發(fā)生沖突。
3.extern
概述
extern的作用是聲名外部變量,全局變量可能定義在使用處之后,或者別的文件中。從聲名處起可以合法的使用外部變量。
聲名變量和定義變量的區(qū)別:
1.定義變量會(huì)創(chuàng)建一塊內(nèi)存,而聲名不會(huì)。
2.變量可以聲名多次,但是只能定義一次。
4.sizeof和strlen
1.sizeof是用算符,能計(jì)算各種變量所占的內(nèi)存大小。strlen是函數(shù),只能計(jì)算字符串的有效長度,不包括'\0'。
2.sizeof計(jì)算內(nèi)存長度時(shí)不會(huì)考慮內(nèi)存里的內(nèi)容,只考慮長度。
5.malloc和free
概述
malloc申請(qǐng)一塊指定大小的堆內(nèi)存。
free釋放指針指向的malloc申請(qǐng)。
注意點(diǎn):
1.mallco的參數(shù)是要申請(qǐng)內(nèi)存的大小,返回值是一個(gè)viod無類型的指針,需要強(qiáng)轉(zhuǎn)后賦值給指針變量。
同類函數(shù):
1.calloc:申請(qǐng)一塊內(nèi)存,然后將每一個(gè)字節(jié)初始化為0。
pt = (int *)calloc(10, sizeof(int))
2.ralloc:更改已經(jīng)申請(qǐng)出來的內(nèi)存。第二個(gè)參數(shù)為重新申請(qǐng)后的大小。
注意:如果pt后面足夠擴(kuò)展,則會(huì)返回pt。如果pt后面不足,那么會(huì)尋找一塊足夠的新內(nèi)存,把原來內(nèi)存里的數(shù)據(jù)拷貝過來。返回新內(nèi)存的指針。
pt = (int *)ralloc(pt, sizeof(int) *20)
2.malloc函數(shù)不一定100%申請(qǐng)成功,調(diào)用完要判空。申請(qǐng)出的堆內(nèi)存不一定干凈,所以一點(diǎn)要初始化。
3.free函數(shù)只是斬?cái)鄡?nèi)存和指針的關(guān)系,內(nèi)存還在,指針還在。指針要賦值為NULL,避免成為野指針。
用例
#include <malloc.h> // 頭文件
int *pt = NULL;
pt = (int *)malloc(sizeof(int) * 10);
if(pt == NULL)
{
;//error
}
memset(pt, 0x00, sizeof(int) * 10);
printf("%d\n",sizeof(pt));
printf("%d\n",sizeof(pt) * 10);
free(pt);
pt = NULL;
6.strcpy和memcpy以及sprintf
概述
strcpy
函數(shù)原型,返回的是目標(biāo)字符串的地址。
char *strcpy(char *dest, const char *src);
特點(diǎn):strcpy只要用于兩個(gè)字符串之間的拷貝。當(dāng)源比目標(biāo)大時(shí)會(huì)報(bào)錯(cuò)。所有要使用安全版本strncpy。注意strcpy和strncpy都是遇到'\0'結(jié)束復(fù)制,不會(huì)復(fù)制'\0'。
char *strncpy(char *dest, const char *src, int n);
復(fù)制目標(biāo)字符串的前n個(gè)字符。
memcpy
函數(shù)的原型,返回的是拷貝目標(biāo)的地址。
void *memcpy(void *destion, void *source, unsigned n);
特點(diǎn):從源拷貝n個(gè)字節(jié)到目標(biāo)。但是當(dāng)源和目標(biāo)有內(nèi)存重疊時(shí)會(huì)發(fā)生淺拷貝(很少見)。如果有這種風(fēng)險(xiǎn)可以使用memmove,memmove內(nèi)部做了內(nèi)存重疊的處理。
sprintf
特點(diǎn):將所有類型轉(zhuǎn)換為字符串的情況用的多,現(xiàn)在用sprintf_s的安全版本。
char pt1[10];
sprintf_s(pt1, "char:%d", 5);
printf("%s\n", pt1);
printf是將數(shù)據(jù)轉(zhuǎn)換成字符串以后打印在屏幕上,而sprintf是保存在指定的字符串中。
7.switch的參數(shù)和跳出問題
概述
可以作為switch參數(shù)的類型有:int, char, bool, short
不能作為switch參數(shù)的類型有:float, double
switch從第一個(gè)匹配到的分支進(jìn)入,遇到break才跳出。
8.while和do while的區(qū)別
while和do while的區(qū)別是,當(dāng)?shù)谝淮闻袛鄔hile條件失敗時(shí),while執(zhí)行0次,while執(zhí)行1次。
9.register
register關(guān)鍵字定義變量,變量存在寄存器中。用于頻繁使用的變量可以提高性能。
由于其不放在內(nèi)存中,所以不能取地址,不能是自定義的變量類型。
靜態(tài)變量不能用register修飾。