目录
1.指针函数
概念
本质是函数,返回值是指针
格式
数据数据 * 函数名(形参)
{
函数体
return 地址;//失败则返回NULL
}
2.函数指针
概念
本质是指针,指向的是函数
格式
数据类型 (*指针名)(参数列表);
数据类型: 与指向函数的返回值类型保持一致
参数列表:与指向函数的参数列表保持一致
基本用法
1.用作函数指针
int add(int a, int b)
{
return a + b;
}
int main()
{
int (*p)(int, int);
p = add;
printf("%d\n", p(2, 3));
}
2.函数指针作为另一个函数的参数,实现接口重用-->多态
int add(int a, int b)
{
return a + b;
}
int test(int (*p)(int ,int))
{
printf("test:%d\n",p(3,4));
return 0;
}
int main()
{
test(add);
return 0;
}
3.函数指针数组
概念
本质是数组,数组中存放的是函数指针
格式
数据类型 (*数组名[元素个数])(参数列表);
数据类型:和指向函数的返回值类型一致
参数列表:和指向的函数的参数列表一致
例如:int (*arr[2])(int,int)={函数名,函数名}
4.共用体
所有成员变量共用一块地址空间
格式
union 共用体名
{
成员列表;
};
定义共用体变量
union 共用体名字 变量名;
union value
{
int a;
char b;
};
union value val;
val.a=10;
val.b='a';
特性
1)所有成员共用同一块地址空间
2)以最后一次赋值为内存中的实际数据
3)共用体的大小为成员中类型最大的数据的大小
共用体测大小端
union value val;
val.a = 0x12345678;
if(val.b == 0x78)
printf("小端\n");
else if(val.b == 0x12)
printf("大端\n");
5.枚举
定义
一种构造数据类型,用于声明一组常数
格式
enum 枚举类型名
{
常数1,
常数2,
};
注意:没有赋初值时默认从0开始,向后依次递增
6.存储类型
(1)auto
自动型,修饰局部变量,存放在栈区(一般省略)
(2)static
静态型,可以修饰局部变量和全局变量,也可以修饰函数
注意:
1.存放在静态区/全局区,.bss(未初始化的全局变量和静态变量) .data(初始化的全局变量和静态变量)
2.初始值默认为0,只初始化一次
3.限制作用域 ,修饰全局变量被限制仅能在本文件中使用,修饰局部变量,作用域被限制在本函数中,但会延长其生命周期
4.修饰函数,被限制仅能在本文件中使用
(3)extern
外部引用:可以引用其他文件中的全局变量和函数,在本文件中使用
例如:有file1.c和file2.c两个文件
file1.c
#include<stdio.h>
int n=5;
void fun()
{
printf("hello\n");
}
file2.c
#include<stdio.h>
extern int n; //外部引用file1.c中的全局变量n
extern void fun();//外部引用file1.c中的函数fun
int main()
{
fun();
printf("n=%d\n",n);
return 0;
}
(4)register
寄存器类型,由于寄存器数量较少,申请不到空间时和auto一样
7.条件编译
(1)根据宏是否定义
#define 宏名
#ifdef 宏名
/*code1*/
#else
/*code2*/
#endif
执行顺序:判断宏是否定义,如果定义了就编译code1,否则编译code2
(2)根据宏值
#define 宏名 值
#if 宏名
/*code1*/
#else
/*code2*/
#endif
执行顺序:判断宏的值是否为0,如果不为0编译code1,否则编译code2
(3)防止头文件重复包含(放在头文件中)
#ifndef 宏名
#define 宏名
/*code*/
#endif