C初探:數據類型、數組、內存布局、指針

windows命令行 (可以不用搭理這里,在Linux玩就行)

Windows C/C++編譯器: https://sourceforge.net/projects/mingw/files/

配置環境變量 PATH: ${MinGW安裝目錄}/MinGW/bin

c與c++

C語言是一門通用計算機編程語言,廣泛應用于底層開發。

C語句是面向過程的語言,c++是面向對象的語言,C++對c進行擴展。

C是C++的子集,C++是C的超集,所以大部C語言程序都可以不加修改的拿到C++下使用。

1、基本數據類型

1.**signed**----有符號,可修飾char、int。Int是默認有符號的。
2.**unsigned**-----無符號,修飾int 、char
整型 字節 取值范圍 占位
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

為了得到某個類型或某個變量在特定平臺上的準確大小,使用 sizeof 運算符。

表達式 sizeof(type) 得到對象或類型的存儲字節大小。

long int 其實就是長整型 = long 可以省去int
在標準中,規定 int至少和short一樣長,long至少和int一樣長。

為什么會存在long?

long和int在早期16位電腦時候 int 2字節,long 4字節,而計算機發展到現在,一般32、64下,long和int一樣。和java類比的話,java的long就是 long long 8字節

格式化還有:

8進制 %o
16進制 小寫: %x 大寫:%X
(0x)+16進制前面 %#x

浮點型 字節 精度 占位
float 4 6位小數 %f
double 8 15位小數 %lf
long double 8 19位小數 %Lf

C99標準以前,C語言里面是沒有bool,C++里面才有,
C99標準里面定義了bool類型,需要引入頭文件stdbool.h
bool類型有只有兩個值:true =1 、false=0。
因此實際上bool就是一個int
所以在c/c++中 if 遵循一個規則, 非0為true,非空為true;
NULL 其實也就是被define為了 0

2、格式化

include <stdio.h>

printf、sprintf等

sprintf:

? 將格式化的數據寫入第一個參數

char str[100];
sprintf(str, "img/png_%d.png", 1);
printf("%s", str);

//使用 0 補到3個字符
sprintf(str, "img/png_%03d.png", 1);
printf("%s", str);

3、數組與內存布局

數組 : 連續的內存

//java
int[] a

//c
//必須聲明時候確定大小
int a[10]  
//或者 直接初始化 
int a[] = {1,2,3}

//大小
printf("%d",sizeof(a)/sizeof(int));

棧內存限制 linux:ulimit -a 查看
但是直接分配這么大不行,因為堆棧可能保存參數,返回地址等等信息

動態內存申請

malloc
沒有初始化內存的內容,一般調用函數memset來初始化這部分的內存空間.

calloc
申請內存并將初始化內存數據為NULL.

? int *pn = (int*)calloc(10, sizeof(int));

realloc

? 對malloc申請的內存進行大小的調整.

char *a = (char*)malloc(10);
realloc(a,20);

特別的:
alloca
在棧申請內存,因此無需釋放.
int *p = (int *)alloca(sizeof(int) * 10);

物理內存
物理內存指通過物理內存條而獲得的內存空間

虛擬內存
一種內存管理技術
電腦中所運行的程序均需經由內存執行,若執行的程序占用內存很大,則會導致內存消耗殆盡。
虛擬內存技術還會勻出一部分硬盤空間來充當內存使用。

代碼段:
存放程序執行代碼(cpu要執行的指令)

棧是向低地址擴展數據結構
堆是向高地址擴展數據結構

進程分配內存主要由兩個系統調用完成:brk和mmap 。

  1. brk是將_edata(指帶堆位置的指針)往高地址推;
  2. mmap 找一塊空閑的虛擬內存。

通過glibc (C標準庫)中提供的malloc函數完成內存申請
malloc小于128k的內存,使用brk分配內存,將_edata往高地址推,大于128k則使用mmap

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • C語言中內存分配 在任何程序設計環境及語言中,內存管理都十分重要。在目前的計算機系統或嵌入式系統中,內存資源仍然是...
    一生信仰閱讀 1,193評論 0 2
  • 搬運自牛客網大神總結 extern關鍵字 extern修飾變量是個聲明,此變量/函數是在別處定義的,要在此處引用 ...
    leon4ever閱讀 3,703評論 0 9
  • 前言 C語言作為一門應用途廣泛、功能強大、使用靈活的面向過程式編程語言。既可用于編寫應用軟件,又能用于編寫系統軟件...
    老板娘來盤一血閱讀 13,030評論 32 83
  • 在日常生活中我們會處處面臨選擇,比如早晨吃什么飯,要不要邊吃飯邊聽聽書,是坐公交車上班還是打車,這些情況雖然都是選...
    生活即道閱讀 261評論 0 0
  • 巡視四周,形形色色的鬼喝著忘憂,真是千奇百態。唯獨不見仇龍鏡主,隨便問了個鬼二,才得知仇龍出去了,小二也不知道他什...
    我是小代同學閱讀 169評論 0 0