第一部分C語(yǔ)言的組成
一.基本數(shù)據(jù)類(lèi)型
- java中有八中基本數(shù)據(jù)類(lèi)型党窜,而在c/c++中沒(méi)有byte和boolean(在C中0為false灯变,非0為true)
- 在c語(yǔ)言中多了long long unsiged(無(wú)符號(hào)设凹,只能大于等于0)singned整形修飾
- 和java語(yǔ)言同一種數(shù)據(jù)類(lèi)型所占內(nèi)存大小不一致咆霜,char涎嚼,long
- sizeof運(yùn)算符杉辙,計(jì)算當(dāng)前數(shù)據(jù)類(lèi)型所占用的字節(jié)的大小席噩,如果傳入變量名稱(chēng)班缰,計(jì)算出變量對(duì)應(yīng)的數(shù)據(jù)類(lèi)型的長(zhǎng)度
- C的基本數(shù)據(jù)類(lèi)型(九種數(shù)據(jù)類(lèi)型)
char ,int 悼枢, float 埠忘,double , signed ,unsigned 莹妒,long 名船,short and void; - java中的數(shù)據(jù)類(lèi)型和C語(yǔ)言的數(shù)據(jù)類(lèi)型對(duì)比
java C
1 boolean byte char
2 char short short
4 int float int long float
8 long double double 旨怠,long long
二.基本輸入輸出函數(shù)
在c語(yǔ)言中都是先聲明在使用的渠驼,printf輸出函數(shù)和scanf輸入函數(shù)均在頭文件中已聲明
-
數(shù)據(jù)輸入或者輸出的表現(xiàn)形式
%d - int %ld – long int %c - char %f - float %u – 無(wú)符號(hào)數(shù) %hd – 短整型 %lf – double %x – 十六進(jìn)制輸出 int 或者long int 或者short int %o - 八進(jìn)制輸出 %s – 字符串 %p-指針 scanf("%d",&i);//將int變量i的地址傳遞 輸入數(shù)據(jù)賦值給i的地址對(duì)應(yīng)的數(shù)據(jù) \n不能停止輸入 printf("i=%d\n",i);
三.指針
- 指針就是內(nèi)存地址
- 內(nèi)存的特點(diǎn)
- 最小單位是byte
- 內(nèi)存是線(xiàn)性連續(xù)的排列
- 32為操作系統(tǒng)最大的內(nèi)存4G ,操作系統(tǒng)管理的一段內(nèi)存空間鉴腻,32位操作系統(tǒng)每一個(gè)進(jìn)程的最大可用內(nèi)存是4G,4G=2^32=4294967296
- 什么是指針
- 對(duì)內(nèi)存最小單元進(jìn)行編號(hào) 0~~4294967295
- 每一個(gè)內(nèi)存單元的編號(hào)稱(chēng)之為指針
- 指針就是內(nèi)存地址
- 指針的作用
- 可以直接訪(fǎng)問(wèn)硬件
- 快速傳遞數(shù)據(jù)
- 表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu)
- 方便處理字符串等
- 指針訪(fǎng)問(wèn)內(nèi)存的運(yùn)算符
&取地址運(yùn)算符 &變量名
-
*取對(duì)象運(yùn)算符 *指針
#include <stdio.h> int main(){ int i;//在內(nèi)存中申請(qǐng)4個(gè)字節(jié)內(nèi)存 申請(qǐng)大小根據(jù)數(shù)據(jù)類(lèi)型確定 i=10;//通過(guò)變量名操作這段內(nèi)存 printf("i=%d\n",i); //通過(guò)取地址運(yùn)算符獲取變量i的內(nèi)存地址 &i; //通過(guò)*取對(duì)象運(yùn)算符操作內(nèi)存地址對(duì)應(yīng)的內(nèi)存空間 *&i = 20; printf("i=%d\n",i); return 0; }
- 指針變量
- 保存指針的變量也就是保存地址的變量迷扇;
- 指針變量的定義: 保存指針的數(shù)據(jù)類(lèi)型 * 變量名
- 指針變量在32位操作系統(tǒng)上的內(nèi)存大小為4個(gè)字節(jié)(固定的)
- 指針的數(shù)據(jù)類(lèi)型和指針類(lèi)型
- 指針類(lèi)型: 指針變量去掉變量名 保存首地址對(duì)應(yīng)的變量類(lèi)型*
- 指針的數(shù)據(jù)類(lèi)型: 指針變量指向的變量數(shù)據(jù)類(lèi)型
- 指針的數(shù)據(jù)類(lèi)型不確定指針變量占用的內(nèi)存大小,決定指針變量訪(fǎng)問(wèn)的內(nèi)存長(zhǎng)度
- 值傳遞和引用傳遞
- java中:
- 基本數(shù)據(jù)類(lèi)型都是值傳遞
- 對(duì)象傳遞都是引用傳遞
- C語(yǔ)言中:一般都是值傳遞
- java中:
- 指針常見(jiàn)的一些錯(cuò)誤
- 混用不同的指針 不同指針變量不能直接賦值爽哎,可強(qiáng)轉(zhuǎn)之后再賦值浪默,但需保證強(qiáng)轉(zhuǎn)有意義
- 野指針 定義的指針變量沒(méi)有合法指向类少,沒(méi)有保存任何變量的首地址焙格;
- 定義指針變量要有合法的指向芜茵,如果暫時(shí)沒(méi)有就指向NULL指針 int *pi=NULL
- NULL指針不可讀不可寫(xiě)盹舞,訪(fǎng)問(wèn)就會(huì)報(bào)錯(cuò)产镐;
四.數(shù)組
-
數(shù)組
java數(shù)組對(duì)象 c語(yǔ)言數(shù)組相同數(shù)據(jù)類(lèi)型的集合;
定義數(shù)組: int arr【4】踢步;
訪(fǎng)問(wèn)數(shù)組: arr【0】 arr【1】 C語(yǔ)言不檢查角標(biāo)越界癣亚;
求數(shù)組元素個(gè)數(shù): sizeof(arr)/sizeof(arr【0】)
數(shù)組名代表首元素首地址
-
數(shù)組的傳遞需要傳遞數(shù)組名和數(shù)組元素的個(gè)數(shù)
void print_arr(char arr[4],int count){ int i=0; for(i=0;i<count;i++){ printf("arr[%d]=%d\n",i,*(arr+i)); } }
-
指針和數(shù)組之間的關(guān)系
數(shù)組名代表首元素首地址
-
C語(yǔ)言中不檢查角標(biāo)越界
int *pi=arr
*(pi+0)《==》pi[0] …… *(pi+3)《==》pi[3]
-
進(jìn)程的內(nèi)存分布
· - 局部變量 被{}包裹的變量 作用范圍再{}以?xún)?nèi) 生命周期執(zhí)行完{}后銷(xiāo)毀- 全部變量 沒(méi)有被任意的{}包裹 可以一直使用
- static修飾局部變量 作用范圍不變,生命周期和全局變量一直
-
void *指針
- 不同類(lèi)型的指針不可以直接賦值需要強(qiáng)轉(zhuǎn)之后才可賦值然而對(duì)于void*指針則可以直接進(jìn)行賦值不需要強(qiáng)轉(zhuǎn)获印,這個(gè)就是這個(gè)指針的特點(diǎn)述雾;
- 對(duì)于java中object類(lèi)型的數(shù)據(jù)轉(zhuǎn)化可以用void*指針來(lái)接受,
malloc和free使用
-
字符串
- c語(yǔ)言中沒(méi)有字符串兼丰,以字符數(shù)組表示字符串玻孟,以“\0”作為字符串的結(jié)束標(biāo)記
- 字符串的定義---兩種定義方式
//按照字符數(shù)組方式定義字符串
//hello
// char arr[6]={'h','e','l','l','o','\0'};
// char arr[6]={"hello"};
char arr[6]="hel";
int coun;
// arr[0]='d';
// printf("arr=%s\n",arr);
//定義數(shù)組方式二
// char *pc = "hello"; //定義了字符串常量
// char *pc=arr;//定義普通字符串 可以修改字符串的數(shù)據(jù)
// *pc='r';
// char *pc=NULL;
// pc="hello";
// *pc='p';
- 字符串的傳遞只需要傳遞字符串首元素首地址,有\(zhòng)0結(jié)束標(biāo)記
- 字符串求長(zhǎng)度:便利字符數(shù)組找到\0結(jié)束標(biāo)記
- 字符串函數(shù)
- //字符串長(zhǎng)度 coun = strlen(arr);
- 字符串比較 int c = strcmp(arr,arr1);
五.結(jié)構(gòu)體
-
定義結(jié)構(gòu)體鳍征,三種類(lèi)型黍翎,普通的結(jié)構(gòu)體,全局的結(jié)構(gòu)體艳丛,匿名的結(jié)構(gòu)體匣掸;
#include <stdio.h> //定義結(jié)構(gòu)體類(lèi)型 int struct Student{//struct 結(jié)構(gòu)體標(biāo)識(shí) Student 結(jié)構(gòu)體名 char *name;//姓名 int age; float score; }; struct Student{//struct 結(jié)構(gòu)體標(biāo)識(shí) Student 結(jié)構(gòu)體名 char *name;//姓名 int age; float score; }stu;//定義結(jié)構(gòu)體類(lèi)型全局變量 struct{//struct 結(jié)構(gòu)體標(biāo)識(shí) Student 結(jié)構(gòu)體名 char *name;//姓名 int age; float score; }stu;//匿名結(jié)構(gòu)體 只能定義一個(gè)變量 int main(){ //結(jié)構(gòu)體類(lèi)型變量 struct Student stu;//局部變量 return 0; }
-
訪(fǎng)問(wèn)結(jié)構(gòu)體中的字段
stu.name="hello"; stu.age=23; stu.score=59.9;
結(jié)構(gòu)體傳遞屬于值傳遞
結(jié)構(gòu)體定義指針 - struct Student *pstu
-
通過(guò)結(jié)構(gòu)體一級(jí)指針訪(fǎng)問(wèn)結(jié)構(gòu)體字段
- (*pstu).name
- 通過(guò)一級(jí)指針指向訪(fǎng)問(wèn)pstu->name
6.聯(lián)合體union
- 不能夠同時(shí)操作多個(gè)字段,只能一次操作一個(gè)字段
- 聯(lián)合體內(nèi)存是里面最大字段占用的內(nèi)存
六. 枚舉
七. typedef關(guān)鍵字 起別名
- 作用:
- 可以簡(jiǎn)化定義氮双,某些函數(shù)指針名或者結(jié)構(gòu)體指針比較長(zhǎng)碰酝,可以通過(guò)起別名的方式來(lái)定義,此種方式可以簡(jiǎn)化代碼戴差;
int i;//i變量名
typedef int i;//i代表int數(shù)據(jù)類(lèi)型
i a;//定義了int數(shù)據(jù)類(lèi)型
struct Student stu送爸;//stu結(jié)構(gòu)體變量名
typedef struct Student stu;//stu 代表結(jié)構(gòu)體類(lèi)型 struct Student
stu sstu;//定義了結(jié)構(gòu)體類(lèi)型的變量
void (*padd)(int,int,int *);//padd函數(shù)指針變量名
typedef void (*padd)(int,int,int *);//padd代表指針類(lèi)型
padd ppadd;