C(一) 初探

c與c++

C語(yǔ)言是一門通用計(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ù)類型

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è)類型或某個(gè)變量在特定平臺(tái)上的準(zhǔn)確大小,使用 sizeof 運(yùn)算符。

表達(dá)式 sizeof(type) 得到對(duì)象或類型的存儲(chǔ)字節(jié)大小。

long int 其實(shí)就是長(zhǎng)整型 = long 可以省去int
在標(biāo)準(zhǔn)中,規(guī)定 int至少和short一樣長(zhǎng),long至少和int一樣長(zhǎng)。

為什么會(huì)存在long?

long和int在早期16位電腦時(shí)候 int 2字節(jié),long 4字節(jié),而計(jì)算機(jī)發(fā)展到現(xiàn)在,一般32、64下,long和int一樣。和java類比的話,java的long就是 long long 8字節(jié)

格式化還有:

8進(jìn)制 %o
16進(jìn)制 小寫: %x 大寫:%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類型,需要引入頭文件stdbool.h
bool類型有只有兩個(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ù)寫入第一個(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);</pre>

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ì)勻出一部分硬盤空間來(lái)充當(dāng)內(nèi)存使用。

image.png
image.png

代碼段: 存放程序執(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 。

  1. brk是將_edata(指帶堆位置的指針)往高地址推;

  2. 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.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容