day02

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值