1、大小存储端
小端存储:低字节存低地址,高字节存高字节
大端存储:高字节存低地址,低字节存高地址
2、指针函数
(1)、全局变量与局部变量
全局变量:可以作用于整个程序
局部变量:只能用于部分空间
注(6):
①全局变量需要定义在所有函数之
②全局表变量作用于整个程序的所有空间,因此某一局部修改全局变量,则其他局部空间也会被修改
③全局变量若未初始化,系统赋固定值0
④普通局部变量作用范围为局部,在其他局部不能被调用
⑤局部变量与全局变量重名,优先调用局部变量
⑥全局作用于整个程序,局部变量从局部变量调用开始到局部调用结束
笔试题:比较全局变量与局部变量纬度
a、声明周期
b、作用范围
c、初始化
d、全局变量修改
e、重名调用
(2)、内存图
内存指:程序运行临时存储的区域
内存划分:内核区域和用户区域
内核区:
用户区:栈区
堆区
全局变量和静态区
堆栈区别:
(3)、指针函数
定义:返回值为指针的函数
核心:如何返回局部空间地址
①在局部空间使用全局变量地址
②将实参所在空间的地址传入函数中
③static修饰局部变量,会延长该变量的生命周期直到程序结束(将局部变量从栈区放入静态区)
static用法 static修饰
a,多次调用使用上一次调用
b,未初始化,系统赋确定值
c,限制全局变量不能被外部代用
d,限制函数不能被外部调用
④malloc
<1>malloc()申请空间
头文件:#include<stdlib.h>
函数原型:void * malloc(size_t size);
功能:分配size字节所需要的内存空间,并返回指向t他的指针
参数:size表示需要申请的内存空间大小
返回值:成功 返回指向内存空间的指针
失败 返回NULL
注:a,申请空间不一定成功,因此 需要判断<是否成功>
b空间未初始化,需要进行初始化操作
c,申请空间大小0,不代表失败
d,使用malloc申请的空间需要强制类型转换
<2>判断申请空间是否成功
<3>初始化memset()
头文件;#include
函数原型:void memset(void str,int c,size_t n)
功能;复制字符到参数所指向字符串的前n个字符
参数:str–指向要填充的内存块
c—要设置的值,用无符号字符
n----字符数
返回值
成功 返回指向存储区str指针
失败 返回NULL
<4>使用申请空间
<5>释放申请空间free()
头文件: #include<stdlib.h>
函数原型:void free(void ptr)
功能:释放之前调用calloc.malloc或realloc所分配的空间
参数:指向一个要释放内存的内存块
返回值:无
注:a,只能释放c,a,r申请的空间
b、释放后指向NULL,否则就是野指针
c、不能重复释放
------------------------------ day03-----------------------------------------加粗样式
1、typedef和define
typedef 表示类型重命名
格式:typedef <原始数据类型> <新的数据类型>
注:从该行向下的所有的原始数据类型名都被新数据类型替换
笔试原题:比较typedef与define?
①define是预处理命令,typedef是语句
②define可以替换常量,变量,表达式等,typedef只能作用于数据类型的重命名
③define在编译时不会检查错误,typedef会有类检查功能
2、函数指针
指向函数的指针,指针是函数类型
格式:<返回值类型>(*<指针变量名>)(参数列表);
int fun(int m,int n) ==> int (int ,int ) fun
int (int,int)==type ==>type fun
type *p=&fun ==>type *p=NULL;p=&fun
int (int ,int )*p=&fun;==>>int (*p)(int int)=&fun// int (*p)(int ,int)=NULL;p=&fun==>*p=fun
fun(5,8);==*p(5,8);
3、函数指针数组
本质是数组,数组元素是指针
格式:<返回值>(*<数组名[数组大小]>)(形参列表);
笔试原题:要对绝对地址0x100000赋值,我们可以用*(unsigned int*)0x100000 = 1234;
那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
①将绝对地址变成函数地址 void (*p)()=(void (*)())0x100000;
②函数调用p();
或者:(void (*)())0x100000();
4、递归函数
自己掉自己的函数
递推:
回归:
注:①回归条件设置一定要合适,否则容易出现死循环
②递推层数不易太多,否则系统负担太重,影响运行
5、回调函数
使用函数指针在回调时刻调用函数
6、结构体
(1)定义:一组数据类型不相同且内存连续的数据集合
(2)格式:struct <结构体名>{
成员列表;
};
注:①struct表示结构体标记
②结构体表示一种构造数据类型,一般以struct<结构体>表示当前结构体数据类 ,使用方式类似于基本数据类型
③结构体名,符合标识符命名规则,不能单独使用
④成员变量数据类型可以相同也可以不同,以‘;’分隔
⑤结构结尾用‘;’结束
⑥一般定义在所有函数之外
⑦结构体可以嵌套结构体,也可以嵌套共用体
(3)结构体变量声明(3)
①struct <结构体名>{
成员列表;
...;
};
使用:struct <结构体名> <变量名> = {成员值1,成员值2,.....};
②struct <结构体名>{
成员列表;
...;
}<变量名>={成员1,成员2,...};
③struct
{
成员变量;
}<变量名>={成员1,成员2,...};
(4)调用
<结构体名>.<成员变量>
(5)结构体数组:数据类型为结构体的数组
格式:strcut <结构体名> <数组名>[数组大小]
调用:<数组名>[下标].<结构体成员>
(6)结构体指针
strcut <结构体名> *<指针名>;
(7)结构体传参:值、地址、数组
(8)结构体大小计算
前提:1、32位操作系统默认4字节对齐,64位操作系统默认8字节对齐
2、分双不分单(给结构体成员分配空间时,以双数大小分配)
(9)结构体嵌套
(10)枚举:enum
作用;用于设置错误代码
格式:enum<枚举名>{
成员列表;
};
注:①enum表示枚举类型的关键字
②一般直接使用成员名即可
③表示一定范围内的数字,并且默认递增;若所有成员均未赋值,默认第一个成员为0
④成员列表中的成员没有数据类型,只有成员名,一般大写
⑤成员列表中的成员以‘,’分隔
(11)共用体(共同体或联合体)union
①定义:定义在共同体的成员在同一时刻只能有一个成员生效
②格式;union <共同体名>
{
成员列表;
....
};
注:a,unio为共同体标记
b,union<共同体名> 表示一种构造数据类型,其使用类似于基础数据类型
c,成员列表由变量声明构成,但是同一时刻只有一个成员生效
d,定义后需要添加‘;’
e,一般定义在全局
③共同体变量
其定义类似于结构体,但是初始化时只能给一个变量赋值
(12)条件编译:—按照条件进行程序的部分编译
①根据宏是否定义,选择编译
#ifdef <宏名>
...语句块1;
#else
....语句块2;
#enif//结束标志(个人理解)
注:若宏被定义,则表示语句块2被屏蔽,执行语句块1; 否则,表示语句块1被屏蔽,执行语句块2
②根据宏值,选择编译
#if <宏名>
...语句块1
#else
...语句块2;
#endif
注:若宏值为真,则执行语句块1,否则执行语句块2