函数指针和指针函数的使用

指针函数

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

静态型,可以修饰局部变量和全局变量,也可以修饰函数

  1. 存放在静态区/全局区,.bss(未初始化的全局变量和静态变量) .data(初始化的全局变量和静态变量)
  2. 初始值默认为0,只初始化一次
  3. 限制作用域 ,修饰全局变量被限制仅能在本文件中使用,修饰局部变量,作用域被限制在本函数中,但会延长其生命周期
  4. 修饰函数,被限制仅能在本文件中使用
extern:外部引用,通过引用将其他文件中的全局变量和函数,放到本文件中使用
register:寄存器类型
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

  • 12
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值