首页 > 代码库 > 入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)
入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)
1、指针函数与函数指针、函数指针数组
指针函数:返回值为指针的函数
char *fun() { char str[] = "hello world"; return str; } int main() { char *p = fun(); puts(p); return 0; }
编译时,会出现警告,返回了一个已经被释放掉的内存空间的首地址
解决方法:1、static
2、char *str = "hello world";
3、malloc 注意:使用完后要free并将指针置为NULL(相对于方法二,这个更加合理!str地址认为的去开辟不会干扰到正常进程)
typedef:给一个已有的类型取别名
typedef unsigned int size_t;
给unsigned int类型取个别名叫做size_t
unsigned int a;
size_t a;
>>>> malloc
void *malloc(size_t size);
功能:程序员手动在堆区申请内存空间
参数:size:需要申请的内存空间的大小(字节)
返回值:成功:申请到的内存空间的首地址
失败:NULL ---- 当内存不足时
>>>>memset
void *指针,作为形参,可以接收任何类型的指针
void *memset(void *s, int c, size_t n);
功能:设置内存空间的值,按照字节
参数:s---》要设置的内存空间的首地址
c---》要设置的值
n---》内存空间的大小 (字节)
返回值:设置好的内存空间的首地址
>>>>bzero
void bzero(void *s, size_t n);
功能:清空一片连续的内存空间
参数:s---》需要 清空的内存空间的首地址
n---》要清空的大小
>>>> void free(void *ptr);
功能:释放ptr指向的内存空间
>>>函数指针:指向函数的指针
int fun(int a); int (*p)(int) = fun; fun(10); p(10);
注意:函数名为函数的入口地址
这个和数组指针很类似!
>>>函数指针数组
是数组,数组的元素为函数指针,指针指向函数
int (*p[4])(int, int);
>>>递归函数:自己调用自己----》展开
void fun(int i) { if(i > 0) { fun(i/2); } printf("i = %d\n", i); } int main() { fun(10); return 0; }
4、结构体---》可以用来描述一个具体的事物
声明:struct 结构体名
{
数据类型 成员名1;
数据类型 成员名2;
。。。。。。。。
};
声明结构体:主要是告诉编译器,有这么一个结构体类型(strcut 结构体名),一般是在main函数前面声明
定义结构体变量:strcut 结构体名 变量名;
访问结构体成员:结构体变量名.成员名;
>>>结构体指针---指向结构体变量的指针
int *p;
struct 结构体名 *p = &结构体变量名;
通过结构体指针访问成员:指针变量名->成员名;
>>>结构体数组
struct 结构体名 数组名[元素个数];
struct Table arr[3];
2、共用体---》大小端
特点:共用体的所有成员共同使用同一内存空间
共用体所占内存大小:占用内存空间最大的成员所占的内存大小
声明:union 共用体名
{
数据类型 成员名1;
数据类型 成员名2;
。。。。。。。。
};
定义共用体变量:union 共用体名 变量名;
大小端---》存储方式
大端存储:低字节数据存放在高地址,高字节数据存放在低地址
小端存储:低字节数据存放在低地址,高字节数据存放在高地址
3、枚举----》一般用作错误码的定义
enum 枚举名
{
成员1,
成员2,
成员3
};
入职培训笔记记录--day9(1、指针函数与函数指针、函数指针数组 2、malloc memset 3、递归函数 4、结构体 5、共用体---》大小端 6、枚举)