c與c++
C語(yǔ)言是一門(mén)通用計(jì)算機(jī)編程語(yǔ)言,廣泛應(yīng)用于底層開(kāi)發(fā)镊掖。
c語(yǔ)句是面向過(guò)程的語(yǔ)言乃戈,c++是面向?qū)ο蟮恼Z(yǔ)言,C++對(duì)c進(jìn)行擴(kuò)展亩进。
c是c++的子集,c++是c的超集偏化,所以大部c語(yǔ)言程序都可以不加修改的拿到c++下使用。
1镐侯、基本數(shù)據(jù)類(lèi)型
1.**signed**----有符號(hào)侦讨,可修飾char、int苟翻。Int是默認(rèn)有符號(hào)的韵卤。
2.**unsigned**-----無(wú)符號(hào),修飾int 崇猫、char
整型 | 字節(jié) | 取值范圍 | 占位 |
---|---|---|---|
int | 4 | -2,147,483,648 到 2,147,483,647 | %d |
unsigned int | 4 | 0 到 4,294,967,295 | %u |
short | 2 | -32,768 到 32,767 | %hd |
unsigned short | 2 | 0 到 65,535 | %hu |
long | 4 | -2,147,483,648 到 2,147,483,647 | %ld |
unsigned long | 4 | 0 到 4,294,967,295 | %lu |
char | 1 | -128 到 127 | %c |
unsigned char | 1 | 0 到 255 | %c |
為了得到某個(gè)類(lèi)型或某個(gè)變量在特定平臺(tái)上的準(zhǔn)確大小沈条,使用 sizeof 運(yùn)算符。
表達(dá)式 sizeof(type) 得到對(duì)象或類(lèi)型的存儲(chǔ)字節(jié)大小诅炉。
long int 其實(shí)就是長(zhǎng)整型 = long 可以省去int
在標(biāo)準(zhǔn)中,規(guī)定 int至少和short一樣長(zhǎng)蜡歹,long至少和int一樣長(zhǎng)。
格式化還有:
8進(jìn)制 %o
16進(jìn)制 小寫(xiě): %x 大寫(xiě):%X
(0x)+16進(jìn)制前面 %#x
浮點(diǎn)型 | 字節(jié) | 精度 | 占位 |
---|---|---|---|
float | 4 | 6位小數(shù) | %f |
double | 8 | 15位小數(shù) | %lf |
long double | 8 | 19位小數(shù) | %Lf |
C99標(biāo)準(zhǔn)以前涕烧,C語(yǔ)言里面是沒(méi)有bool月而,C++里面才有,
C99標(biāo)準(zhǔn)里面定義了bool類(lèi)型议纯,需要引入頭文件stdbool.h
bool類(lèi)型有只有兩個(gè)值:true =1 父款、false=0。
因此實(shí)際上bool就是一個(gè)int
所以在c/c++中 if 遵循一個(gè)規(guī)則瞻凤, 非0為true憨攒,非空為true;
NULL 其實(shí)也就是被define為了 0
2阀参、格式化
include <stdio.h>
printf肝集、sprintf等
sprintf:將格式化的數(shù)據(jù)寫(xiě)入第一個(gè)參數(shù)
char str[100];
sprintf(str, "img/png_%d.png", 1);
printf("%s", str);
//使用 0 補(bǔ)到3個(gè)字符
sprintf(str, "img/png_%03d.png", 1);
printf("%s", str);
3、數(shù)組與內(nèi)存布局
數(shù)組 : 連續(xù)的內(nèi)存
//java
int[] a
//c
//必須聲明時(shí)候確定大小
int a[10]
//或者 直接初始化
int a[] = {1,2,3}
//大小
printf("%d",sizeof(a)/sizeof(int));
棧內(nèi)存限制 linux:ulimit -a 查看
但是直接分配這么大不行蛛壳,因?yàn)槎褩杏瞻?赡鼙4鎱?shù)所刀,返回地址等等信息
動(dòng)態(tài)內(nèi)存申請(qǐng)
malloc
沒(méi)有初始化內(nèi)存的內(nèi)容,一般調(diào)用函數(shù)memset來(lái)初始化這部分的內(nèi)存空間.
calloc
申請(qǐng)內(nèi)存并將初始化內(nèi)存數(shù)據(jù)為NULL.
` int *pn = (int*)calloc(10, sizeof(int));`
realloc
對(duì)malloc申請(qǐng)的內(nèi)存進(jìn)行大小的調(diào)整.
char *a = (char*)malloc(10);
realloc(a,20);
特別的:
alloca
在棧申請(qǐng)內(nèi)存,因此無(wú)需釋放.
int *p = (int *)alloca(sizeof(int) * 10);
物理內(nèi)存
物理內(nèi)存指通過(guò)物理內(nèi)存條而獲得的內(nèi)存空間
虛擬內(nèi)存
一種內(nèi)存管理技術(shù)
電腦中所運(yùn)行的程序均需經(jīng)由內(nèi)存執(zhí)行,若執(zhí)行的程序占用內(nèi)存很大伐憾,則會(huì)導(dǎo)致內(nèi)存消耗殆盡。
虛擬內(nèi)存技術(shù)還會(huì)勻出一部分硬盤(pán)空間來(lái)充當(dāng)內(nèi)存使用赫模。
代碼段:
存放程序執(zhí)行代碼(cpu要執(zhí)行的指令)
棧是向低地址擴(kuò)展數(shù)據(jù)結(jié)構(gòu)
堆是向高地址擴(kuò)展數(shù)據(jù)結(jié)構(gòu)
進(jìn)程分配內(nèi)存主要由兩個(gè)系統(tǒng)調(diào)用完成:brk和mmap 树肃。
- brk是將_edata(指帶堆位置的指針)往高地址推;
- mmap 找一塊空閑的虛擬內(nèi)存瀑罗。
通過(guò)glibc (C標(biāo)準(zhǔn)庫(kù))中提供的malloc函數(shù)完成內(nèi)存申請(qǐng)
malloc小于128k的內(nèi)存胸嘴,使用brk分配內(nèi)存,將_edata往高地址推,大于128k則使用mmap
[站外圖片上傳中...(image-4387ab-1614846532032)]