指针函数
1:本质函数,返回值为指针
1.2:格式:
数据数据 * 函数名(形参)
{
函数体
return 地址;//失败一般会返回NULL
}
#include<stdio.h>
#include<stdlib.h>
char *yue()
{
// char a[32]="hello";//栈区,函数调用结束后空间被释放
// char *s="hello";//常量区,不会被释放
// 开辟堆区空间
char *a = (char *)malloc(sizeof(a) * 40);
if (a == NULL)//判断堆区空间是否开辟成功
{
printf("err");
return NULL;
}
strcpy(a, "hello");//赋值
return a;//返回值
}
int main(int argc, char const *argv[])
{
char *p = yue();
printf("%s\n", p);
free(p);
p = NULL;
return 0;
}
2:函数指针
1:本质为指针,指向函数
数据类型 (*指针名)(参数列表);
数据类型: 与指向函数的返回值类型保持一致
参数列表:与指向函数的参数列表保持一致
int sub(int a,int b)
{
return a+b;
}
int fun(int a,int b)
{
return a-b;
}
int test(int (*p)(int,int)) //函数指针
{
printf("%d\n",p(3,4));
}
int main(int argc, char const *argv[])
{
int (*p)(int,int);
p=sub;
printf("%d\n",p(2,3));
p=fun;
printf("%d\n",p(2,3));
test(sub);
test(fun);
return 0;
}
2:函数指针数组的使用
1.概念:本质是数组,数组中存放的是函数指针
2.格式:
数据类型 (*数组名[元素个数])(参数列表);
数据类型:和指向函数的返回值类型一致
参数列表:和指向的函数的参数列表一致
int (*a[2])(int,int)={sub,fun};
for(int i=0;i<2;i++)
printf("%d\n",a[i](3,4));
3:共用体的使用
union 名字{
成员列表;
};
注释:
1)所有成员共用同一块地址空间
2)以最后一次赋值为内存中的实际数据
3)共用体的大小为成员中类型最大的数据的大小
union value
{
int a;
char b;
}a;
int main(int argc, char const *argv[])
{
a.a=0x12345678;
if(a.b==0x78)
printf("1\n");
else if(a.b==0x12)
printf("2\n");
return 0;
}
4:枚举
没有初值时默认从零开始,向后一次递增
格式:enum 枚举类型名
{
常数1,
常数2,
};
5:存储类型
auto
自动型,修饰局部变量,存放在栈区(一般省略)
static
静态型,可以修饰局部变量和全局变量,也可以修饰函数
- 存放在静态区/全局区,.bss(未初始化的全局变量和静态变量) .data(初始化的全局变量和静态变量)
- 初始值默认为0,只初始化一次
- 限制作用域 ,修饰全局变量被限制仅能在本文件中使用,修饰局部变量,作用域被限制在本函数中,但会延长其生命周期
- 修饰函数,被限制仅能在本文件中使用
6:条件编译:
6.1:宏是否定义(定义了执行code1,未定义执行code2)
#define 宏名
#ifdef 宏名
/*code1*/
#else
/*code2*/
#endif
6.2:根据宏值(若宏值为0则编译code2,不为0编译code1)
#define 宏名 值
#if 宏名
/*code1*/
#else
/*code2*/
#endif
6.3:防止头文件重复:
注释:放在头文件中定义
#ifndef 宏名
#define 宏名
/*code*/
#endif
标签:宏名,return,函数,int,char,printf,函数指针,指针
From: https://blog.csdn.net/m0_67638362/article/details/140866766