C语言----函数、指针、数组

目录

​编辑

指针函数

本质

格式:

函数指针

1、 概念

2、 格式

3、 举例

3.1基本用法

3.2函数指针作为函数参数的用法(回调函数)

函数指针数组

1. 概念

2. 格式

3. 例子


指针函数

本质

是函数,返回值为指针

格式:

数据类型 *函数名(形参列表)

{

函数体

return 指针/地址; //return NULL; 一般表示返回失败的情况

}

实例:

char *fun()
{
    //buf是局部的,函数调用结束空间释放,自己写程序时不可以这样写
    //char buf[32] = "hello";  
    //想要实现在函数外能拿到hello字符串,方式如下:
   
    //方式一:
    char *buf = "hello"; //"hello"存在常量区
    
    //方式二:
    char *buf = (char *)malloc(32); //在堆区开辟空间
    strcpy(buf, "hello");
    return buf;
}
int main(int argc, char const *argv[])
{
    char *p = fun();
    printf("%s\n", p);  
    free(p);
    p = NULL; 
    return 0;
}

思考:封装一个函数,获取堆区空间的首地址。

//方式一:通过函数的返回值拿到堆区空间首地址
// char *getmemory(int n)
// {
//     char *p = (char *)malloc(n); //成功:首地址,失败:NULL
//     if(p == NULL)
//         return NULL;
//     return p;
// }
//方式二:通过函数参数拿到堆区空间首地址
void getmemory(char **p, int n)
{
    *p = (char *)malloc(n);
}
int main(int argc, char const *argv[])
{
    // char *m = getmemory(32);
    char *m = NULL;
    getmemory(&m, 32);
    strcpy(m, "helloworld");
    printf("%s\n", m);
    return 0;
}

函数指针

1、 概念

本质是指针,指针指向函数的指针

2、 格式

数据类型 (*指针名)(形参列表);

数据类型:指向的函数的返回值类型

形参列表:和指向的函数的参数一致,此处形参列表可以只保留数据类型,变量名可以省略,如:int (*p)(int, int);

3、 举例

3.1基本用法

int add(int a, int b)
{
    return a+b;
}
int sub(int a, int b)
{
    return b-a;
}
int main(int argc, char const *argv[])
{
    //函数指针
    int (*p)(int, int) = add; //函数名代表函数的入口地址
    p = sub; //改变指针的指向,指向sub函数
    printf("%d\n", add(3, 4));
    printf("%d\n", p(3, 4));
    return 0;
}

3.2函数指针作为函数参数用法(回调函数)

int sub(int a, int b)
{    return b-a;
}
int add(int a, int b)
{    return a+b;
}
//函数指针作为函数参数
int test(int a, int b,int (*p)(int, int))
{
    return a+b+p(1, 3);
}
int main(int argc, char const *argv[])
{    
    //可以给test函数传递不同的函数,实现代码的复用
    printf("%d\n", test(10, 20, add));
    printf("%d\n", test(10, 20, sub));
    return 0;
}

注意:后面学习中常见的使用流程:

系统给提供包含函数指针的函数接口,用户调用此函数,并自定义函数给函数指针传参

函数指针数组

1. 概念

本质是数组,数组中存放函数指针(指向函数的指针)

2. 格式

数据类型 (*数组名[元素个数])(形参列表);

如:int (*arr[3])(int, int) = {函数名};

3. 例子

int add(int a, int b)
{
    return a+b;
}
int sub(int a, int b)
{
    return a-b;
}
int mul(int a, int b)
{
    return a*b;
}
int main(int argc, char const *argv[])
{
    //函数指针数组
    
    1.  // 定义时赋初值
     int (*arr[3])(int, int) = {add, sub, mul};

    
    2.  // 定义时未赋初值,需要单个元素赋值
    int (*arr[3])(int, int);
    arr[0] = add;
    arr[1] = sub;
    arr[2] = mul;
    for(int i = 0; i < 3; i++)
        printf("%d\n", arr[i](3, 4));
    return 0;
}

练习:

1. 用变量a表示下面定义

a) 一个整型数

b)一个指向整型数的指针

c)一个指向指针的的指针,它指向的指针是指向一个整型数

d)一个有10个整型数的数组

e) 一个有10个指针的数组,该指针是指向一个整型数的。

f) 一个指向有10个整型数数组的指针

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数

h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeeJot

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值