指针
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]数据的合法方式。