第一部分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;