Tips
- C語言區(qū)分大小寫
- C編譯器忽略空格
- 所有的 C 語言程序都需要包含 main() 函數(shù)且警,代碼從 main() 函數(shù)開始執(zhí)行革娄。
C11
C11(也被稱為C1X)指ISO標準ISO/IEC 9899:2011沼琉,是當(dāng)前最新的C語言標準舶沿。
在它之前的C語言標準為C99席噩。
C環(huán)境
-
文本編輯器 (例:vi/vim)
輸入程序挑秉,編輯器創(chuàng)建的文件——源文件勋拟。
C程序源文件擴展名 “.c” -
C編譯器 (例:GNU的C/C++編譯器)
源代碼編譯成最終的可執(zhí)行程序勋磕。
工作流程:源程序(source code)→預(yù)處理器(preprocessor)→編譯器(compiler)→匯編程序(assembler)→目標程序(object code)→連接器(鏈接器,Linker)→可執(zhí)行程序(executables)
C程序包含內(nèi)容
- 預(yù)處理器指令
- 函數(shù)
- 變量
- 語句 & 表達式
- 注釋
預(yù)處理
include <stdio.h>
#include "my.h"
stdio.h表示系統(tǒng)文件庫, 也可以聲明其它的敢靡。
.h表示頭文件,因為這些文件都是放在程序各文件的開頭挂滓。
#include 告訴預(yù)處理器將指定頭文件的內(nèi)容插入到預(yù)處理器命令的相應(yīng)位,導(dǎo)入頭文件的預(yù)編譯指令啸胧。
<> 表示系統(tǒng)自帶的庫赶站,也可以寫成" " 表示用戶自定義的庫。
<>直接到系統(tǒng)指定的目錄下查找該文件纺念;
" "先在當(dāng)前目錄查找有無該頭文件贝椿,有則包含該目錄下的頭文件,沒有則到系統(tǒng)指定的目錄下找該頭文件陷谱。
防止重復(fù)include:
- #pragma once
某些老的編譯器不支持 - #ifndef XXX
#define XXX
#endif
出現(xiàn)宏名重復(fù)团秽,即字符串中有與宏名相同的字符串
#undef FILE_SIZE
#define FILE_SIZE 42 //取消原定義,重新定義叭首。
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif //沒有定義MESSAGE习勤,則進行定義
預(yù)定義宏
- __DATE__ : 日期
- __TIME__ : 時間
- __FILE__ : 當(dāng)前文件名
- __LINE__: 代碼當(dāng)前行號
- __STDC__:當(dāng)編譯器以 ANSI 標準編譯時,則定義為 1焙格。
注釋方式
- //單行注釋
- /* 單行注釋 */
- /*
多行注釋
多行注釋
多行注釋
*/
數(shù)據(jù)類型
- 基本類型:整數(shù)類型图毕、浮點類型
- 枚舉類型
- void類型
表明沒有可用的值、無類型
void表示函數(shù)沒有返回值眷唉,
而用int或其他予颤,則函數(shù)需要有返回值如:
int egg()
{
return 0;
}
- 派生類型:指針類型、數(shù)組類型冬阳、結(jié)構(gòu)類型蛤虐、共用體類型、函數(shù)類型
整數(shù)類型
類型 | 大小 | 值范圍 |
---|---|---|
char | 1字節(jié) | -128 到 127 或 0 到 255 |
unsigned char | 1字節(jié) | 0 到 255 |
signed char | 1 字節(jié) | -128 到 127 |
int | 2 或 4 字節(jié) | -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647 |
unsigned int | 2 或 4 字節(jié) | 0 到 65,535 或 0 到 4,294,967,295 |
short | 2 字節(jié) | -32,768 到 32,767 |
unsigned short | 2 字節(jié) | 0 到 65,535 |
long | 4 字節(jié) | -2,147,483,648 到 2,147,483,647 |
unsigned long | 4 字節(jié) | 0 到 4,294,967,295 |
signed表示有符號的肝陪,即+/-驳庭;
unsigned表示無符號。
具體字節(jié)大小查詢:
printf("int 存儲大小 : %lu \n", sizeof(int));
浮點類型
類型 | 存儲大小 | 值范圍 | 精度 |
---|---|---|---|
float | 4 字節(jié) | 1.2E-38 到 3.4E+38 | 6 位小數(shù) |
double | 8 字節(jié) | 2.3E-308 到 1.7E+308 | 15 位小數(shù) |
long double | 16 字節(jié) | 3.4E-4932 到 1.1E+4932 | 19 位小數(shù) |
枚舉
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
}; //分別 = 1 2 3 4 5 6 7
enum DAY
{
MON, TUE=3, WED, THU, FRI, SAT, SUN
}; //分別 = 0 3 4 5 6 7 8
枚舉變量定義
enum DAY
{
MON, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
enum DAY
{
MON, TUE, WED, THU, FRI, SAT, SUN
} day;
enum
{
MON, TUE, WED, THU, FRI, SAT, SUN
} day;
常量
定義常量
#define THIS 10;
const int ABCDE = 10;
存儲類
auto
只能用在函數(shù)內(nèi),即 auto 只能修飾局部變量饲常。register
static
extern
運算符
位運算符(二進制)
- & 與
- | 或
- ^ 異或
相同為0蹲堂,不同為1 - ~ 取反
- << 二進制左移
假設(shè)A=60,A<<2得到240
60二進制:0011,1100
左移2位后的二進制:1111,0000(即十進制240) - >> 二進制右移
A=60贝淤,A>>2得到15
60:0011,1100
右移2位后的二進制:0000,1111(即十進制15)
循環(huán)
循環(huán)控制語句
- break:終止循環(huán)或switch語句柒竞。
- continue:立即停止本次循環(huán),開始下一次循環(huán)播聪。
- goto:轉(zhuǎn)移到被標記的語句朽基。
作用域
- 局部變量
函數(shù)內(nèi)部使用 - 全局變量
整個程序的生命周期
- 如果全局變量和局部變量名字相同, 優(yōu)先使用局部變量离陶。
- 全局變量自動初始化踩晶。
數(shù)組
初始化數(shù)組
int a[5] = {5, 2,4, 7, 50}; //一維數(shù)組
int a[3][4] = {
{0, 1, 2, 3} , /* 初始化0行 */
{4, 5, 6, 7} , /* 初始化1行 */
{8, 9, 10, 11} /* 初始化2行 */
};
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
多維數(shù)組
int x[3][4] //二維數(shù)組
指針
輸出變量地址:
printf("a變量的地址: %p\n", &a );
指針是變量,值為另一個變量的內(nèi)存地址枕磁,即十六進制數(shù)渡蜻。
整數(shù)型、浮點型等指針计济,指針類型都一樣茸苇,而指向的數(shù)據(jù)類型不同。
int main ()
{
int a = 20;
int *ip;
ip = &a; //指針指向數(shù)組為:int b[5]; ip = b;
printf("變量地址: %p\n", &a ); //bffd8b3c
printf("指針存儲地址: %p\n", ip ); //bffd8b3c
printf("指針訪問值: %d\n", *ip ); // 20
return 0;
}
空指針:
int *ip = NULL; //此時地址是0x0
指針的指針:
int a;
int *ptr;
int **pptr;
a = 8;
ptr = &var;
pptr = &ptr;
字符串
char a[6] = {'h', 'e', 'l', 'l', 'o', '\0'};
char a[] = "hello";
結(jié)構(gòu)體
typedef struct abcd
{
}__attribute__((packed)) abcd;
__attribute__((packed))的作用:取消字節(jié)對齊沦寂,減少占用空間学密,讓內(nèi)存緊湊存儲。
共用體
union Data
{
int i;
float f;
char str[20];
} data;
共用體成員訪問運算符(.)
位域
位域的長度不能大于一個字節(jié)的長度传藏,也就是說不能超過8位二進位腻暮。
typedef
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
輸入輸出
輸入
scanf() 函數(shù)用于從標準輸入(鍵盤)讀取并格式化;
scanf("%s %d", str, &i); //char前無&毯侦,int前有&
getchar()
gets()
輸出
printf() 函數(shù)發(fā)送格式化輸出到標準輸出(屏幕)哭靖。
- %d 格式化輸出整數(shù)
- %f 格式化輸出浮點型數(shù)據(jù)
- %s 字符串
- %c 字符
putchar()
puts()
文件讀寫
打開并寫入文件
#include <stdio.h>
int main()
{
FILE *fp = NULL;
fp = fopen("/tmp/test.txt", "w+");
fprintf(fp, "This is testing for fprintf...\n");
fputs("This is testing for fputs...\n", fp);
fclose(fp);
}
訪問模式 | 備注 |
---|---|
r | 打開一個已有的文本文件,允許讀取文件侈离。 |
w | 打開一個文本文件试幽,允許寫入文件。如果文件不存在卦碾,則會創(chuàng)建一個新文件铺坞。在這里,您的程序會從文件的開頭寫入內(nèi)容洲胖。如果文件存在济榨,則該會被截斷為零長度,重新寫入绿映。 |
a | 打開一個文本文件擒滑,以追加模式寫入文件。如果文件不存在,則會創(chuàng)建一個新文件橘忱。在這里,您的程序會在已有的文件內(nèi)容中追加內(nèi)容卸奉。 |
r+ | 打開一個文本文件钝诚,允許讀寫文件。 |
w+ | 打開一個文本文件榄棵,允許讀寫文件凝颇。如果文件已存在,則文件會被截斷為零長度疹鳄,如果文件不存在拧略,則會創(chuàng)建一個新文件。 |
a+ | 打開一個文本文件瘪弓,允許讀寫文件垫蛆。如果文件不存在,則會創(chuàng)建一個新文件腺怯。讀取會從文件的開頭開始袱饭,寫入則只能是追加模式。 |
強制類型轉(zhuǎn)換
int sum = 17, count = 5;
double mean;
mean = (double) sum / count;
可變參數(shù)
即函數(shù)輸入數(shù)量不固定
利用stdarg.h 中的va_list呛占、va_start虑乖、va_arg、va_end
內(nèi)存管理
內(nèi)存分配管理函數(shù):在<stdlib.h> 頭文件
void *calloc(int num, int size);
在內(nèi)存中動態(tài)地分配 num 個長度為 size 的連續(xù)空間晾虑,并將每一個字節(jié)都初始化為 0疹味。它的結(jié)果是分配了 num*size 個字節(jié)長度的內(nèi)存空間,并且每個字節(jié)的值都是0帜篇。void free(void *address);
該函數(shù)釋放 address 所指向的內(nèi)存塊,釋放的是動態(tài)分配的內(nèi)存空間糙捺。void *malloc(int num);
在堆區(qū)分配一塊指定大小的內(nèi)存空間,用來存放數(shù)據(jù)笙隙。這塊內(nèi)存空間在函數(shù)執(zhí)行完成后不會被初始化继找,它們的值是未知的。void *realloc(void *address, int newsize);
該函數(shù)重新分配內(nèi)存逃沿,把內(nèi)存擴展到 newsize婴渡。
內(nèi)存分配示例:
description = (char *)malloc( 200 * sizeof(char) );
calloc(200, sizeof(char));
description = (char *) realloc( description, 100 * sizeof(char) ); // 重新分配內(nèi)存
free(description); // 釋放內(nèi)存
命令行參數(shù)
48頁