目录
一.基本类型
1.1.整型
- 分类
- 存储形式
- 大小:有符号:最小-32768;最大负数:-1;最大:32767;无符号u/U:最小0,最大65535
- D(DEC):十进制; O(OCT):八进制; B(BIN):二进制;0x/0X:十六进制
1.2.实型(浮点型)
注意:e之前必须要由数字,e之后的指数必须为整数
1.3.字符型char
- 字符常量(ASCII码:0-255)
- 字符变量:存放字符常量,1个字节,8位
- 字符串常量
二.构造类型
2.1.数组类型[]
数组是具有相同类型的一组有序数据的集合,数组在内存中占用一段连续的存储空间
2.1.1.字符数组
- 专门存放字符的,且数组的每一个元素只能存放一个字符;
- 注意输入时的空格和换行符
- 注意""和''的区别
2.1.2.一维数组
- 数组定义
类型名 数组名[常量表达式]
注:
1)常量表达式(确定数组的长度):可以包含整型的常量和符号常量,不能包含变量。
2)C语言不允许对数组的长度动态定义。
3)数组一经定义,C语言编译系统就在内存中分配一段连续的空间,用来存储数组个元素的值;
4)数组名表示一端连续空间的起始地址
- 数组引用
数组名[下标],例:a[5],a[i+j]
注:下标:可以是整型,也可以是整型表达式;只能是逐个引用,循环
- 数组的初始化
若没有对数组元素赋值,则其值是随机值;初始化是在给数组分配空间时进行的赋值。
1)完全初始化 int a[10]={1,2,3,4,5,6,7,8,9,10};
2)部分初始化 int a[10]={1,2,3,4,5};
3)省略数组长度初始化 int a[]={1,2,3,4,5,6,7,8,9,10};
注:部分初始化,没有赋值的自动补0或0.0;如果超出长度,编译会出错;省略数组长度的初始化,有多少个元素,就默认是多少长度
2.1.3.二维数组
- 数组定义
- 数组引用
- 初始化
2.1.4.三维数组
- a[2][3][4];
- 可以想象成一本书,一共有2页,每一页有3行4列
2.2.结构体类型struct
2.2.1.定义
结构体类型可以嵌套定义
2.2.2.结构体变量
系统为定义的结构体变量分配内存空间,可以对变量进行赋值,存取,运算
1.定义
1)先定义结构体类型,再定义结构体变量
struct结构体名 结构体变量名表
2)在定义结构体类型的同时定义结构体变量
struct 结构体名{结构体成员表}结构体变量名;
3)在定义结构体类型时省略结构体名,直接定义结构体变量
struct(结构体成员表)结构体变量名表;
注:无结构体名的结构体类型无法重复使用
2.内存空间大小
3.引用
- 结构体变量名.成员名
- 同类型的结构体变量可以直接赋值
4.初始化
- 初始化数据的数据类型及顺序要和结构体类型定义中的结构体成员相匹配
- 不可以跳过成员,但可以只给前面的成员赋值,此时未赋初值的由系统根据数据类型自动赋初值
2.2.3.结构体数组
- 具有相同的结构体类型
- struct 结构体名 数组名[常量表达式]
2.2.4.指向结构体的指针
1.定义一个指针变量,可以指向结构体类型struct student
struct student *ps;
//该指针就是结构体变量在内存所占用的存储空间的首地址
2.(* 结构体指针变量名).结构体成员名
注:必须要有圆括号
3.指向成员运算符:->
4.一个结构体指针变量只能用来指向同类型的结构体变量/结构体数组元素,不能使它指向某一成员
2.2.5.指向结构体数组的指针
++p->score
(++p)->score
(p++)->score
2.2.6.函数
- 结构体变量作函数参数——值传递
- 结构体指针变量作函数参数——地址传递
- 函数的返回值为结构体类型
2.3.共用体类型
- 分配到同一段内存空间的不同的数据在存储时采用互相覆盖的技术
- 共用体变量所占用的空间长度是各成员中占据内存空间最大的那个成员的长度
- 定义与变量定义和结构体类似
- 共用体变量.成员名;指针变量
- 共用体变量中起作用的是最后一次存放的成员
- 同类型结构体变量之间可以相互赋值
- 可以出现在结构体定义中,也可以定义共用体数组
2.4.链表
2.4.1动态数据结构
1.单向链表
2.4.2.基本操作
- 创建链表
- 遍历链表
- 添加结点
- 删除节点
三.枚举类型
值有范围限定
enum 枚举名{枚举值列表}
- 枚举值列表:常量标记符;序号从0开始排序;
- 可以显式赋序号,后面未赋值的就是前一个的序号增1
- 可以直接得到用枚举常;也可以利用序号强制转换得到值
- 可以比大小,按照序号比较
- 枚举值不能直接输入和输出,与switch
四.指针类型
4.1.内存空间
以字节为单位的存储单元,编号——地址;内容——值
4.2.引用
1.直接引用
x=6
通过标识符(变量名)存取变量的值;直接修改值,而不关系具体内存单元地址
2.间接引用
- 一个数据所占用空间的首地址又称为这个数据的指针(常量),存放指针的变量称为指针变量(变量)
- 变量的首地址(指针)——变量p(指针变量)
//通过p中存储的值找到变量所占用的内存空间,间接的访问/修改变量x的值
*px=6
4.3.指针变量
- 一个指针变量可以被赋予不同的指针值。(指针变量可以指向不同的对象,但不能同时指向多个对象)
- 一定要有明确的指向,必须赋予具体的值,否则可能会修改到其他不确定的重要数据,甚至死机
- 指针变量的值时内存地址
4.4.一维数组与指针
偏移量:由该数组相对于数组首元素的位置及每个数组元素所占存储空间大小决定
*(a+3)==>a[3]
数组名(数组的首地址)==>指向数组首元素的指针常量
4.4.1使用指针变量引用数组元素
1.可以使用下标方式引用数组元素
//例:p=a或p=&a[0]
//访问数组第i个元素
a[i] //数组下标:
*(a+i)//数组首地址加偏移量:
p[i] //指针下标:
*(p+i) //指针变量加偏移量:
p++;p-- //指针移动
2.指向同一数组的元素的指针
比较运算——元素在数组中的前后顺序
指针的减法运算——数组元素之间的个数
3.数组名与指针变量区别
指针变量在执行期间可以改变,p++合法
数组名是数组的首地址,是指针常量,a++不合法
4.4.2数组名作形参实际上就是一个指针变量存放首地址
- 数组名作为形参时,只是作为一个指针变量用来存放实参数组的首地址。并没有在被调用函数中为其分配一段连续的内存空间用来存放数组元素;
- 此时数组名做形参时是指针变量可以++。
- 指针变量做形参时与数组名相同,因此这时两者是等价的。
4.4.3.指向字符的指针变量和字符数组的区别
- 意义
指针变量是一个变量,用于存放字符串的首地址,可以自增
字符数组名代表首地址,是常量,不能进行自增
- 初始化方式
字符数组名不能直接进行操作;
字符指针:char * str="scwv"==>char *str;str="scevs"
- 使用指针更方便快捷
- 字符串转数组,相比较
4.5.多维数组和指针
4.5.1.二维数组与指针
- a[4][3]四行三列
2.顺序排序
3.通过行指针
类型标识符(* 行指针变量名)[长度]
形参为二维数组名实质上就是定义一个行指针变量
4.5.2指针数组
int * p[5]
类型标识符 * 指针数组名[长度]
4.5.3.main函数
只能有2个; main(int argc,char * argv[])
argc:命令行中参数的个数(文件名本身也是一个参数);
argc的值在输入命令行时由系统按参数实际的个数自动赋予
argv:指向字符的指针数组,值为命令行中各字符串的首地址(系统将命令行参数看作字符串表列)
4.5.4.函数和指针
函数指针变量:把函数的入口地址赋给一个指针变量,该指针就指向函数
4.5.5.stdlib.h
提供了一组用于动态内存分配的函数;
供用户在程序执行时申请内存空间以及释放不再需要的内存空间
1. void * malloc(unsigned size)
如果分配成功,返回被分配内存的 void *类型的指针
若没有可用的内存,返回NULL指针
2. void * calloc(unsigned n,unsigned size)
如果分配成功,返回被分配内存的 void *类型的指针
若没有可用的内存,返回NULL指针
3. void * realloc(void * ptr,unsigned size)
分配成功:将原数据从头到尾拷贝到新分配的内存空间,并释放原来ptr所指向的内存空间,同时返回指向新分配内存的 4.void *类型的指针
分配不成功,就不修改原有数据,并返回NULL
5. void free(ptr)
只有通过动态分配函数分配的空间才能通过free释放
五.空类型
null