第一部分C語言的組成
一.基本數據類型
- java中有八中基本數據類型,而在c/c++中沒有byte和boolean(在C中0為false,非0為true)
- 在c語言中多了long long unsiged(無符號,只能大于等于0)singned整形修飾
- 和java語言同一種數據類型所占內存大小不一致,char,long
- sizeof運算符,計算當前數據類型所占用的字節的大小,如果傳入變量名稱,計算出變量對應的數據類型的長度
- C的基本數據類型(九種數據類型)
char ,int , float ,double , signed ,unsigned ,long ,short and void; - java中的數據類型和C語言的數據類型對比
java C
1 boolean byte char
2 char short short
4 int float int long float
8 long double double ,long long
二.基本輸入輸出函數
在c語言中都是先聲明在使用的,printf輸出函數和scanf輸入函數均在頭文件中已聲明
-
數據輸入或者輸出的表現形式
%d - int %ld – long int %c - char %f - float %u – 無符號數 %hd – 短整型 %lf – double %x – 十六進制輸出 int 或者long int 或者short int %o - 八進制輸出 %s – 字符串 %p-指針 scanf("%d",&i);//將int變量i的地址傳遞 輸入數據賦值給i的地址對應的數據 \n不能停止輸入 printf("i=%d\n",i);
三.指針
- 指針就是內存地址
- 內存的特點
- 最小單位是byte
- 內存是線性連續的排列
- 32為操作系統最大的內存4G ,操作系統管理的一段內存空間,32位操作系統每一個進程的最大可用內存是4G,4G=2^32=4294967296
- 什么是指針
- 對內存最小單元進行編號 0~~4294967295
- 每一個內存單元的編號稱之為指針
- 指針就是內存地址
- 指針的作用
- 可以直接訪問硬件
- 快速傳遞數據
- 表示復雜的數據結構
- 方便處理字符串等
- 指針訪問內存的運算符
&取地址運算符 &變量名
-
*取對象運算符 *指針
#include <stdio.h> int main(){ int i;//在內存中申請4個字節內存 申請大小根據數據類型確定 i=10;//通過變量名操作這段內存 printf("i=%d\n",i); //通過取地址運算符獲取變量i的內存地址 &i; //通過*取對象運算符操作內存地址對應的內存空間 *&i = 20; printf("i=%d\n",i); return 0; }
- 指針變量
- 保存指針的變量也就是保存地址的變量;
- 指針變量的定義: 保存指針的數據類型 * 變量名
- 指針變量在32位操作系統上的內存大小為4個字節(固定的)
- 指針的數據類型和指針類型
- 指針類型: 指針變量去掉變量名 保存首地址對應的變量類型*
- 指針的數據類型: 指針變量指向的變量數據類型
- 指針的數據類型不確定指針變量占用的內存大小,決定指針變量訪問的內存長度
- 值傳遞和引用傳遞
- java中:
- 基本數據類型都是值傳遞
- 對象傳遞都是引用傳遞
- C語言中:一般都是值傳遞
- java中:
- 指針常見的一些錯誤
- 混用不同的指針 不同指針變量不能直接賦值,可強轉之后再賦值,但需保證強轉有意義
- 野指針 定義的指針變量沒有合法指向,沒有保存任何變量的首地址;
- 定義指針變量要有合法的指向,如果暫時沒有就指向NULL指針 int *pi=NULL
- NULL指針不可讀不可寫,訪問就會報錯;
四.數組
-
數組
java數組對象 c語言數組相同數據類型的集合;
定義數組: int arr【4】;
訪問數組: arr【0】 arr【1】 C語言不檢查角標越界;
求數組元素個數: sizeof(arr)/sizeof(arr【0】)
數組名代表首元素首地址
-
數組的傳遞需要傳遞數組名和數組元素的個數
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)); } }
-
指針和數組之間的關系
數組名代表首元素首地址
-
C語言中不檢查角標越界
int *pi=arr
*(pi+0)《==》pi[0] …… *(pi+3)《==》pi[3]
-
進程的內存分布
· - 局部變量 被{}包裹的變量 作用范圍再{}以內 生命周期執行完{}后銷毀- 全部變量 沒有被任意的{}包裹 可以一直使用
- static修飾局部變量 作用范圍不變,生命周期和全局變量一直
-
void *指針
- 不同類型的指針不可以直接賦值需要強轉之后才可賦值然而對于void*指針則可以直接進行賦值不需要強轉,這個就是這個指針的特點;
- 對于java中object類型的數據轉化可以用void*指針來接受,
malloc和free使用
-
字符串
- c語言中沒有字符串,以字符數組表示字符串,以“\0”作為字符串的結束標記
- 字符串的定義---兩種定義方式
//按照字符數組方式定義字符串
//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);
//定義數組方式二
// char *pc = "hello"; //定義了字符串常量
// char *pc=arr;//定義普通字符串 可以修改字符串的數據
// *pc='r';
// char *pc=NULL;
// pc="hello";
// *pc='p';
- 字符串的傳遞只需要傳遞字符串首元素首地址,有\0結束標記
- 字符串求長度:便利字符數組找到\0結束標記
- 字符串函數
- //字符串長度 coun = strlen(arr);
- 字符串比較 int c = strcmp(arr,arr1);
五.結構體
-
定義結構體,三種類型,普通的結構體,全局的結構體,匿名的結構體;
#include <stdio.h> //定義結構體類型 int struct Student{//struct 結構體標識 Student 結構體名 char *name;//姓名 int age; float score; }; struct Student{//struct 結構體標識 Student 結構體名 char *name;//姓名 int age; float score; }stu;//定義結構體類型全局變量 struct{//struct 結構體標識 Student 結構體名 char *name;//姓名 int age; float score; }stu;//匿名結構體 只能定義一個變量 int main(){ //結構體類型變量 struct Student stu;//局部變量 return 0; }
-
訪問結構體中的字段
stu.name="hello"; stu.age=23; stu.score=59.9;
結構體傳遞屬于值傳遞
結構體定義指針 - struct Student *pstu
-
通過結構體一級指針訪問結構體字段
- (*pstu).name
- 通過一級指針指向訪問pstu->name
6.聯合體union
- 不能夠同時操作多個字段,只能一次操作一個字段
- 聯合體內存是里面最大字段占用的內存
六. 枚舉
七. typedef關鍵字 起別名
- 作用:
- 可以簡化定義,某些函數指針名或者結構體指針比較長,可以通過起別名的方式來定義,此種方式可以簡化代碼;
int i;//i變量名
typedef int i;//i代表int數據類型
i a;//定義了int數據類型
struct Student stu;//stu結構體變量名
typedef struct Student stu;//stu 代表結構體類型 struct Student
stu sstu;//定義了結構體類型的變量
void (*padd)(int,int,int *);//padd函數指針變量名
typedef void (*padd)(int,int,int *);//padd代表指針類型
padd ppadd;