指针 函数指针、回调函数、指针函数、 指向数组的指针

指针

int var_runoob = 10;
int *p;
p = &var_runoob;

在这里插入图片描述

函数指针

函数指针是指向函数的指针变量(函数指针是专门用来存放函数地址的指针)。

函数地址是一个函数的入口地址,函数名代表了函数的入口地址
当一个函数指针指向了一个函数,就可以通过这个指针来调用该函数,可以将函数作为参数传递给函数指针。

通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针指向函数
函数指针可以像一般函数一样,用于调用函数、传递参数。

函数指针变量的声明
*typedef int (fun_ptr)(int,int); // 声明一个指向同样参数、返回值的函数指针类型

#include <stdio.h>
 
int max(int x, int y)
{
    return x > y ? x : y;
}
 
int main(void)
{
    /* p 是函数指针 */
    int (* p)(int, int) = & max; // &可以省略
    int a, b, c, d;
 
    printf("请输入三个数字:");
    scanf("%d %d %d", & a, & b, & c);
 
    /* 与直接调用函数等价,d = max(max(a, b), c) */
    d = p(p(a, b), c); 
 
    printf("最大的数字是: %d\n", d);
 
    return 0;
}

回调函数

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,我们就说这是回调函数。
回调函数的定义
<数据类型> <函数名称> (<参数说明列表>)
{
语句序列;
}

*回调函数的定义*
<数据类型> <函数名称><参数说明列表>{
语句序列;
}

<参数说明列表>中的某个参数是一个函数指针。

指针函数

通常一个函数都有一个返回值,如果一个函数没有返回值,则该函数是一个无值型函数。若一个函数的返回值是指针,则称函数为指针函数。

*指针函数的定义*
<数据类型>  *<函数名称><参数说明列表>{
语句序列;
}

问题分析

#include<stdio.h>
#include<string.h>

char *mystring(void)
{
char str[20] = {0};
strcpy(str, "Welcome");
return str;
}

int main()
{
printf("%s\n",mystring());

return 0;

}

此时结果为乱码
应注意

  • 指针函数返回的地址,在主调函数中,必须是有效的,是可以访问的内存
  • 以上程序,str是函数内部的局部数组,局部变量分配在堆栈中,当函数执行完成后,局部变量自动释放,在主调函数中不能再访问,因此会有警告;

方法:
将局部数组改为静态数组
char str[20] = {0}; 改为static char str[20];
静态变量当程序结束时才回收内存

指向数组的指针

数组名是一个指向数组中第一个元素的常量指针

double balance[50];

balance是一个指向&balance[0]的指针,即数组balance的第一元素的地址:

double *p;
double balance[10];
p = balnce;
  • 使用数组名作为常量指针是合法的,反之亦然。*(balance+4)是一种访问balance[4]数据的合法方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值