丹尼斯 裡奇
1 是一個面向過程的計算機高級語言--不需要任何運行環境便能運行的程序語言;
2 標准:目前是C11 (K&R C—>ANSI C / C89標准—>C99標准——>C11標准)
用法:
1.單行注釋 //想注釋的內容
2.多行注釋: /*想注釋的內容*/
用法:
1.由26個英文字母的大小寫、10個阿拉伯數字0~9、下劃線_,$組成;
注意:
有四大類:整型(int) 浮點型(單精度(float)和雙精度(double)) 字符型char 字符串型
特點: 數據不會被改變
變量類型 變量名; 如:int num;
1.賦值 num=1; 2.修改 num=2;
特點:
一,是什麼?
在所有函數外部定義的變量,稱為全局變量。
二,有什麼用?
用於存儲一個需要長期存於內存,並需要改變的變量.
三,怎麼用?
跟普通變量沒區別,只在位置在在所有函數之外.
四,什麼時候用?
當需要定義一個隨程序一直存於內存中,並可以被其它函數共享的變量時候.
五,有什麼特點?
1.生命生期跟隨程序.程序啟動創建,程序退出其才會銷毀
2.作用域是其所在位置之下的所有函數,都可以共享並改變.
3.變量的使用遵循就近原則如果函數內有同名變量,那麼用函數自已的.
4.如果沒有初始化賦值,默認值是0;
常用格式化字符串:%d 整數 %f 浮點數 %c 單個字符 %s字符串 %p 指針的值
定義:printf(“<格式化字符串>”, <參量表>);如printf("a=%d\n",123);auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short for
signed void if unsigned
default goto sizeof volatil e
do continue while static
一,是什麼?
是一個C語言的一個關鍵字.
二,有什麼用?
可以給一個數據類型取一個別名,方便使用.
三,怎麼用?
定義: typedef 類型 別名;
如: typedef long int Lint; 表示給一個long int 類型取一個別名為Lint
則: long int a =5;與Lint a=5;二者等效
四,什麼時候用?
當希望給一個類型取一個別名時(類型比較復雜等),可以用,方便理解調用.
五,有什麼特點?
1.定義位置沒有限制,函數內外都可以.
2.作用域為定義位置開始至所處作用域結束.類似於變量
3.可以用於任意數據類型.
4.別名具有數據類型的含義,這是跟宏定義最大區別.
一,是什麼?
是C語言的關鍵字.
二,有什麼用?
控制一個變量或函數的作用域.
三,怎麼用?
修飾函數:static 返回值 函數名(){};表示函數為內部函數只能被本文件訪問.
extern 返回值 函數名(){};表示函數為外部部函數能被程序的所有文件訪問.(默認)
修飾全局變量: static:表示變量只能被當前文件訪問. extern:所有文件共享.(默認)
修飾局部變量: static:表示延長變量生命周期至程序結束. extern:聲名一個全局變量.
四,有什麼特點?
1.外部函數不同文件中也不能重名,但內部函數可以
2.同類型全局變量可以重復定義,但在內存中只有一份.
3.可以在函數內聲名一個全局變量.但要使用必須在函數外定義. extern只是聲名.
4.static修飾定義局部變量,則這個局部變量生命周期延長至程序結束.但作用域不變.
一, 是什麼?
是C語言的關鍵字.
二,有什麼用?
auto: 用於定義一個能自動回收的臨時變量.這個變量在作用域內用完後會自動銷毀.
canst:用於定義一個常量,這個常量在常量區,且在內存中僅有一份.且不能改變.
三,怎麼用?
auto 數據類型 變量名;(默認所有局部變量都是被這個修飾,可以省略)
注意: 1. static修飾的除外. 2.全局變量除外;
canst 數據類型 變量名=值;
注意:一但定義,值就固定不能被改變.
如:
const int a;
一, 是什麼?
是C語言的關鍵字.
二,有什麼用?
讓指令能夠不受條件跨越執行.簡化代碼
三,怎麼用?
int a=0;
if(a==0){
goto heima;
}
printf(“itcast\n”);//這行不會執行
heima:printf("heima\n");//直接跳到這裡執行
三,什麼時候用?
需要不受限制進行指令跳轉時.(如:跳出多層循環嵌套)
一, 是什麼?
是C語言的關鍵字.
二,有什麼用?
register 表示讓程序優先把這個數據存在寄存器中.
volatile 表示讓編譯器不要去優化代碼,不能用緩存,每次使用都必須去內存中獲取.
三,怎麼用?
修飾變量:
register 數據類型 變量名;
volatile 數據類型 變量名;
四,什麼時候用?
register :如果一個變量使用相當頻繁且占用內存又不是很大.可以使用.
全局變量與加了static局部變量除外.
volatile : 如果需要讓計算機嚴格按寫的指令指執行,且能關注變量每一次值的變化,
這個時候可以使用,則編譯器不會對執行指令作優化.
一,是什麼?
是用來存儲一組數據的容器.
二,有什麼用?
用於把同一類型的一組數據統一管理起來.
三,怎麼用?
定義: 數據類型 數組名[長度(數量)] ;初始化:類型 數組名[(長度)]:={元素1,元素2,…}
賦值:數組名[角標(索引)]=值; 使用:數組名[角標];如int a=arr[0];
四,什麼時候用?
當需要管理一組有關聯的數據時.
五,有什麼特點?
一,是什麼?
是用來存儲一組數組的容器.
二,有什麼用?
用於把同一類型的一組數組統一管理起來.
三,怎麼用?
定義: 類型 數組名[數組的數量][子數組的長度] ;
初始化:類型 數組名[數組的數量][子數組的長度] :={{數組1}, {數組2},…}
賦值: 數組名[數組角標][子數組中數據角標]=值;
使用: 數組名[數組角標][子數組中數據角標];如int a=arr[0][1];
四,什麼時候用?
當需要管理一組有關聯的數組時.
五,有什麼特點?
1.與數組基本一樣.但傳遞子數組時傳遞的是地址.
2.子數組數量控制行數,單個子數組長度控制列數.
3.每個子數組類型及長度一致.
一,是什麼?
是一串字符,也是一個以’\0’結尾的字符數組.
二,有什麼用?
用於表示一串字符或文本數據.
三,怎麼用?
定義及初始化: char arr[]=“abc”;或char arr[4]={‘a’,’b’,’c’,’\0’}
輸出:printf(“%s\n”,s);或printf(“%s\n”,&arr[0]); 賦值:strcpy(字符變量名,“字符串");
四,什麼時候用?
當需要表示一串字符或文本的時候.
五,有什麼特點?
1.後面必須有’\0’結尾.否則只算普通的字符數組.但’\0’不會輸出,只表示字符串結束.
2.字符串輸出占位用%s必須遇到\0.才能結束,否則會繼續輸出更高位地址值的字符.
3.strlen函數用於計算一個字符串的長度(字符數量),使用必須引入<string.h>.
4. strlen不會計算\0.且碰到\0結束,但是sizeof不受\0影響,且長度會包含\0.
5.字符串一定是字符數組,但字符數組不一定是字符串.
一,是什麼?
嚴格上來講,指針具有兩層含義:一是指一種數據類型.二是指一種保存地址的變量. 二,有什麼用?
用於存儲某一個地址,從而可以通過地址直接對該地址內存空間中的數據進行操作.
三,怎麼用?
定義: 類型 *指針名;如:int *p;表示定義一個能存int類型地址的指針變量, 名字叫p.
賦值: 指針變量名=指針(地址).注意:指針獲取方法(&變量名).
四,什麼時候用?
當需要存儲地址,以便於操作該地址及地址對應的內存數據的時候.
五,有什麼特點?(注:以下的p表示一個指針變量名)
一,什麼是指針數組?
表示一個數組,用來存指針的數組就叫指針數組.數組裡面的元素都是指針.
如:int *p[3];表示定義一個可以存三個int指針的數組.
賦值: int a1=1,a2=2,a3=3; int *p[3]={&a1,&a2,&a3}; 取值: int *a=p[0];
二.什麼是數組的指針?
表示一個指針,而這個指針類型是數組.
如:int (*p)[3];表示這是一個含有三個元素的int數組的指針.
賦值:int arr[3]={1,2,3}; int (*p)[3]=&arr;
三.什麼是數組元素的指針?
表示一個指針,而這個指針存的是數組一個元素的地址. int arr[1]={1}; int *p=&arr[0];
三,有什麼特點?
1.數組名表示第一個元素的地址,&數組名表示整個數組的地址.二者值相同,但意義不同.
2.指針可以運算.但僅限於加減運算.運算的實質就是地址運算.即地址的移動.
3.地址(+1)向高位移動,而(-1)向低位移動.不同指針類型移動一位(+1或-1)的字節數不同.
4.實際移動的字節數看指針類型,類型占多少個字節,一位就移動多少個字節.
一,怎麼表示一個字符串?
char arr[] = ”likui";
二,怎麼用指針表示一個字符串?
char *p = "likui”;
三,怎麼表示一個字符串數組?
char arrs[2][8] = {”likui“, ”yingying“};
四.怎麼用指針表示一個字符串數組?
char *arrs[2] = {”likui", ”yingying”};
五,有什麼特點?
1.指針定義的字符串是常量,不能被改變.而字符數組定義的是變量.可以被改變.
2.指針定義一個字符串,指針存的實際是在常量區的那個字符串的首字符的地址
一,什麼是指針型函數?
是函數. 這個函數的返回值類型是指針;
定義:類型 * 函數名(參數){return 指針類型;}
如:int *add(int *a){return &a;}.表示定義一個返回值是int指針類型的add函數.
二,什麼是函數指針?
是指針.函數也會在內存開辟一塊空間.函數指針即這塊空間的地址.
定義:函數返回值類型 (*指針名)(參數類型);賦值:指針名=函數名;
如:先定義函數int add(int a){ //...}. int (*p)(int)=add;
使用:指針名(實參); 如:p(3);等效於add(3);
三,有什麼特點?
1.函數指針做加減運算可以,但沒有意義.不建議.
2.函數指針可以當作參數傳遞.因為其是一個指針類型.
3.不管什麼類型的指針,只要是指針,其裡面存的就是地址.
一,是什麼?
是一種數據類型.是構造類型.裡面可以存不同類型的數據.
二,有什麼用?
用於封裝不同的數據類型到一個結構中.方便使用.
三,怎麼用?
定義:1.定義結構體類型 struct 結構體類型{數據類型1 名稱;數據類型2 名稱;…};
2.定義結構體變量及賦值: struct 結構體類型 變量名={數據1,數據2….};
取值:變量名.結構體元素變量名; 賦值:變量名.結構體元素變量名=新值;
四,什麼時候用?
當需要把相關聯的不同數據類型封裝起來一起使用的時候.
五,有什麼特點?
1.可在定義結構體類型時同時定義結構體變量名,可定義匿名類型結構體;
2. 同一作用域內不可重復定義結構體類型和結構變量.匿名類型結構體除外;
3.可在函數內也可在函數外,效果及用法類似於局部變量和全局變量.也可嵌套定義.
4.可同時在函數內外定義同一個類型,使用同樣遵循就近原則,結構體變量也是如此.
一,是什麼?
是數組,只不是數組裡每一個元素是結構體類型。
二,有什麼用?
用於存儲多個有關聯的結構體.
三,怎麼用?
定義及初始化賦值: struct 結構體類型 數組名[長度]={結構體1,結構體2};
如: struct Person{char *name;int age;};
struct Person per={”itheima",2}; struct Person per1={”itcast",3};
struct Person arr[2]={per,per1};
取值:數組名[角標];單獨賦值:數組名[角標]=新的結構體;
如: struct Person per3=arr[0];
四,什麼時候用?
當需要存儲多個有關聯的結構體,並作為一個整體使用時.
五,有什麼特點?
1.遵循數組的特點
一,是什麼?
是指針,只不是指針類型是結構體類型。
二,有什麼用?
用於存儲結構體的地址,並操作地址對應的結構體空間裡的數據.
三,怎麼用?
定義及初始化賦值: struct 結構體類型 *指針名=&結構體變量
如: struct Person{char *name;int age;}; struct Person per={”itheima",2};
struct Person *p=&per;
取值: (*指針名).結構體元素名; 指針名->結構體元素名; (結構體獨有的用法)
賦值: (*指針名).結構體元素名=新值; 指針名->結構體元素名=新值
如: (*p).name,(*p).age;或p->name,p->age;
四,什麼時候用?
當需要使用指針操作結構體時.
五,有什麼特點?
1.指針移動對結構體本身沒有意義.結構體名並不包含第一個元素的地址.
一,是什麼?
是一種數據類型.稱為枚舉類型.是構造類型的一種,裡面存的都是有別名的整型常量.
二,有什麼用?
可以把多個整型常量以別名的形式封裝成一個整體,便於別的變量識別並取值使用.
三,怎麼用?
定義:1.定義枚舉類型 enum 枚舉類型{元素1 , 元素1 , …}; 或{元素1=0,元素2=1,}
2.定義枚舉變量及賦值: enum 枚舉類型 變量名=對應枚舉裡的一個元素名;
取值:變量名=枚舉元素名;
四,什麼時候用?
當一個變量只有固定的多個int取值范圍時.
五,有什麼特點?
1.枚舉類型只能是int值,且不能直接用int常量,需要用別名(建議全部大寫)
2.如果不設定值,那麼默認第一個元素是0,以此類推;
3.同一個作用域內不能出現重復的元素.不同的枚舉類型也不行.
一個C程序的片段,對一個功能進行封裝,簡化代碼,提高復用性
定義:
返回值類型 函數名(形式參數類型 參數名1,……){ 具體代碼 return 返回值}
調用:
函數名(實際參數1,實際參數2,…..);
聲明:
把函數去掉{}拷貝到聲明區域(函數裡或外)就可以了.返回值 函數名(形式參數1,….)
注意:
一,是什麼?
是C語言中以.h結尾的文件,如stdio.h .
二,有什麼用?
用於聲名(描述)一個函數,把多個代碼文件(如a.c;b.c;…)中的函數,聲明在這個文件中,以便於重用 、防止定義的沖突.
三,怎麼用?
定義: 新建一個以.h結尾的文件,把需要用到的函數的聲名直接放在裡面.
引用: 自定義的頭文件:#include “頭文件名.h”
編譯器類庫裡的頭文件:#include <頭文件名.h>
四,什麼時候用?
當程序需要由多個c文件組成時.
五,有什麼特點?
1.在頭文件中僅做聲名,不做具體實現
2.在頭文件有聲名只能確保編譯成功成.o文件;但不確保能鏈接成功.
3.自定義的頭文件引用時必須要有路徑.
一,是什麼?
是C語言中的一個預處理指令.
二,有什麼用?
用於把一個文件的內容拷貝到這行命令所在的位置.
三,怎麼用?
引用: 自定義的文件:#include “文件路徑和名稱”
編譯器類庫裡的文件:#include <文件名>
四,什麼時候用?
當程序需要用到別的文件時.
二進制--計算機語言
十進制--日常用的
代碼表示: 二進制:0b或者0B開頭 八進制:0開頭 十進制:直接寫 十六進制:0x或0X開頭(最大F)
2.進制的打印輸出:
%o:表示輸出不帶符號八進制整數
%x:表示輸出不帶符號十六進制整數
%d:表示輸出有符號十進制整數
%u:表示輸出不帶符號十進制整數
注意:
1.二進與十進制互轉:
2.二進制與八進制互轉:
每3個2進制表示一個8進制:因為0b111==07 (8進制每位最大是7)
3.二進制與十六進制互轉:
每4個2進制表示一個16進制:因為à0b1111==0xF (16進制最大是F)
注意:
10進制à2進制--->8進制或16進制 8進制--->2進制----->10進制或16進制
一.基本數據類型取值范圍---超出取值范圍數據會定義失敗.
一,是什麼?
是直接對整數在內存中的二進制位進行操作的方法(只能操作整形數據)
二,有什麼用?
直接通過操作二進制的位來實現運算,高效
三,怎麼用?
&與運算:對應兩個二進位均為1時,結果位才為1,否則為0。(有假為假==0)
| 或運算:對應的兩個二進位有一個為1時,結果位就為1,否則為0。(有真為真==1)
^ 異或運算:對應的二進位不同時為1,否則為0。(不同為真==1,相同為假==0)
注意:1.相同整數相^的結果是0.2.一個數^另一數兩次結果不變3.整數相^跟順序無關
~ 取反運算:對整數的各二進位進行取反,包括符號位(0變1,1變0,真假互換)
<< 左移:把整數的各二進位全部左移n位,高位丟棄(包括符號位),低位補0。
左移n位其實就是乘以2的n次方(但移動後符號位變化除外,符號位改變則正負改變)
>> 右移:把整數的各二進位全部右移n位,符號位不變。高位的空缺是正數補0;
是負數高位是補0或是補1 取決於編譯系統的規定;右移n位其實就是除以2的n次方
“ + ”加法運算符 “ - ”減法運算符 “ * ” 乘法運算符 “ / ”除法運算符 “ % ” 取余運算符.
“ = ”賦值運算符 “ += ”加等於運算符 “ -= ”減等於運算符
“ ++ ” 自增運算符 “ - - ”自減運算符
“ == ” “ > ” “ < ” “ >= ” “ <= ” “!=”
用法:對數據進行比較,看是否成立,條件成立=真(1),條件不成立=假(0).
int b=1!=2>3<4; 等效於:2>3為假=0. 0<4為真=1, 1!=1為假=0.所以最終結果=0;
“ ||”或 “ && ”與 “ ! ”非
用法:對於多個表達式進行並列真假判斷
注意:
定義:
<真假判斷表達式1>?<表達式2>:<表達式3>;
如: 1+2>4?2+2:3+4; 這個運算過程為:
1+2=3, 3>4為假.則運行3+4這個表達式.所以最終結果為7.
是指編程中用來判定所給定的條件是否滿足,根據判定的結果(真或假)決定執行給出的兩種操作其中的一個
1.if(){} 2.if(){}else{} 3. if(){}else if(){} 4.if(){}else if(){}else{} 5.if() ;
注意:
switch(表達式){ case 常量表達式1: 語句1;break;… case…;default: 語句n;}
注意:
是指編程循環語句,當滿足條件時進入循環,循環判斷,直到不滿足條件跳出循環
根據條件反復執行一段代碼的時候用
while(<條件>) {<語句>}; do {<語句>} while(<條件>);
for( ; ; ){ }裡面是3個語句,兩個分號。
第一個語句是開始前執行,
第二個語句是判斷真假,如果真,就執行後面(大括號內)的代碼。
第三個語句是每次執行完畢後執行
注意:
一,是什麼?
是一個替換代碼的預處理指令
二,有什麼用?
可以在編譯之前進行代碼替換.
三,怎麼用?
開始替換: #define 被替換內容 替換成的內容
如: #define kLength 6 表示從這行開始下面所有代碼中的kLength 替換成6
結束替換: #undef 被替換內容 如: #undef kLength 表示到一行, 宏定義失效
四,什麼時候用?
當需要用一些重復性代碼或簡單的函數運算時,可以用宏定義.提高效率
五,有什麼特點?
1.命名盡量以大寫或小寫k開頭.便於區分.(規范)
2.被雙引號的引起來的不會被替換
3.宏定義只會做代碼替換,不會關注任何邏輯,容易出現優先級錯誤(加括號解決).
4.替換可以設置作用域.如果不設置,作用域則是這行代碼出現到代碼的最後一行.
一,是什麼?
是一個根據條件編譯代碼的預處理指令
二,有什麼用?
可以讓一段代碼只在滿足條件才編譯.提高編譯效率
三,怎麼用?
通用: #if 條件表達式 #elif 條件表達式 #else
與宏定義相關: #ifdef 宏名 表示定義了宏 #ifndef 宏名 表示沒有定義宏
#endif 結束條件編譯.注意一定要加.
四,什麼時候用?
當一些代碼只需要在一定條件下編譯時.
五,有什麼特點?
1.條件編譯不能訪問需要編譯後才能執行的代碼.
2.條件編譯不需要用大括號,所以必須加上結束標識,否則涵蓋下面的所有代碼
3.條件編譯一般跟宏定義配合使用,防止重復包含及交叉包含
一,是什麼?
是對文件或文件內容的輸入(讀)與輸出(寫). 文件操作的函數在<stdio.h>中聲名.
二,怎麼用?
1.打開一個文件並確定操作的方式:fopen(“文件”,”打開方式”);
函數會返回一個文件的指針(即結構體的指針).FILE *
2.開始操作:讀或寫. 常用的文件讀寫函數有三類:
字符讀寫函數:char c=fgetc(文件指針)讀和fputc(字符,文件指針)寫 ;
字符串讀寫函數:fgets(字符緩存,數量,文件指針)讀和fputs(字符緩存,文件指針)寫;
數據塊(二進制)讀寫函數:fread(數據容器,單個數據字節數,總數,文件指針)讀
fwrite(數據容器,單個數據字節數,總數,文件指針)寫;
3.操作完成,關閉文件:fclose(文件的指針)
三,有什麼特點?
1.打開文件的模式限定操作的方式.
2.打開操作文件後一定要關閉文件,否則容易引起內存洩漏.
3.輸入與輸出是相對於操作者而言.