函数指针,函数指针数组,函数返回值为函数指针

函数的名字就是函数的首地址:定义函数指针;

int (*p)(int )

p为函数指针变量名字,int 为函数的返回值类型为int型;(int)为函数的形参类型为int型,

注:因为优先级所以要用(*p),否则就会p先和后面的()结合为int*p(int),意思就变为p(int)函数的返回值为int*

注:main2()函数中   int (*p[])(int ,int )  为一维数组,下面写错了,

#include<stdio.h>
#include<stdlib.h>
int add(int a, int b)
{
    return a + b;
}
int sub(int a, int b)
{
    return a - b;
}
int multiplition(int a, int b)
{
    return a*b;
}
int dive(int a, int b)
{
    return a / b;
}

void main1()
{
    int(*p(int, int))(int, int);//p(int,int)函数的返回值类型为int(*)(int ,int)(函数指针类型)

    system("pause");
}
void main2()
{
    int a = 10; int b = 20;
    //定义一个二维函数指针数组
    int(*p[])(int, int) = { add, sub, multiplition, dive };//【】内可以写数组 的长度,也可以不写,和普通数组一样的
    //用函数指针掉用函数
    printf("%d", p[1](a, b));
    //通过遍历函数指针调用函数和遍历数组一样的
    for (int i = 0; i < 4; i++)
    {
        printf("%3d", p[i](a, b));
    }

    //因为*(p+i)和p[i]是等价的所以:
    for (int(**ps)(int, int) = p; ps < p + 6; ps++)
    {
        printf("%3d", (*ps)(a, b));
    }
    //int(*p)(int ,int )
    //int (*p[])(int ,int)
    //int(**p)(int ,int )

    system("pause");
}
void main33()
{
    //int a[3]={1,2,3}
    //int (*p[])(int,int)={add, sub, multiplition, dive }
    //a和p都是常量,所以不能a=a,p=p

    //int *pa=(int[]){1,2,3};这是在栈上开辟内存
    //int(**pt)(int ,int)二级函数指针,存储函数指针数组名
    //函数指针数组类型为int(*[])(int,int)
    int(**pp)(int, int) = (int(*[])(int, int)){ add, sub, multiplition, dive };

    for (int i = 0; i < 4; i++)
    {
        //这两种方法是
        printf("%3d", pp[i](100, 10));
        //printf("%d\n", (*(pp + i))(100, 10));
    }

    system("pause");

}

void main44()
{
    //在堆上开辟内存
    int(**pp)(int, int) = malloc(4 * sizeof(int(*)(int, int)));
    //对每个数组元素分别赋值;
    *pp = add;
    *(pp + 1) = sub;
    *(pp + 2) = multiplition;
    *(pp + 3) = dive;
    //分别调用
    for (int i = 0; i < 4; i++)
    {
        printf("%3d", (*(pp + i))(100,20));
    }
    system("pause");
}
//普通指针,数组 和 函数指针,函数指针数组

//int *p         int (*p)(int ,int )
//int*p[4]        int (*p[])(int ,int )
//int **p          int (**p)(int ,int)

//typedef 简化书写
//先定义变量, 类型+变量名
//typedef 类型+变量名
//变量名就是类型的别名

 //  int X;
typedef int X;

  // int Y[10];
typedef int Y[10];

//int(*Z)(int, int);
typedef int(*Z)(int, int);

//int(*W[])(int, int);
typedef  int(*W[])(int, int);
//int (**PP)(int ,int )
typedef int(**PP)(int, int);

void main55()
{
    X x1;
    Y y1;
    Z z1;
    W w1 = { add, sub, };
    PP pp1 = (W){ add, sub };
    printf("%3d", sizeof(w1));

    system("pause");
}
//int (** x(    int (*z)(int ,int),int,double    )       )(int);

// x(    int (*z)(int ,int),int,double    )

//x()函数的形参为int (*z)(int ,int),int,double 

// int (*z)(int ,int)为函数指针 

//int (**                  )(int)   是函数返回值类型

//x的返回值二级函数指针,参数,有一个函数指针,int,double,
//x是一个函数
//z函数指针

//int  (*p)[5];//指向数组的指针
//int *p[5];//数组,每一个元素是一个指针

//int( *p[5])(int, int);//函数指针数组
//int( (*(p))[5])(int, int);//指针指向函数指针数组

void  main()
{

    int(*p[5])(int, int);
    int(*(*p)[5])(int, int);//指向 函数指针数组的指针,
    //*p为一个指针,int(*[5])(int, int)为函数指针数组就好理解了,

    system("pause");
}
时间: 2024-10-31 11:34:31

函数指针,函数指针数组,函数返回值为函数指针的相关文章

37 py为什么要使用函数函数中添加文本注释 没有返回值的函数

第一课:为什么要使用函数 首先 要知道 本课程的主要讲解的内容为: 1.为什么要创建函数 2.***函数的概念是:将一段可能别重用的代码封账到一个代码段里面,然后通过函数的参数 ,控制函数的动态部分.// 如何来定义python中的函数和使用函数 *** 3.如何创建一个函数 4.如何为函数添加文档注释,如何获取函数的文档注释 5.函数如何返回一个值 6.改变函数的参数值 7.关键字参数与参数默认值 8.可变参数 9.如何将序列中的元素单独作为参数值传递给函数 10.函数中的作用域 11.递归函

Swift2.0语言教程之函数的返回值与函数类型

Swift2.0语言教程之函数的返回值与函数类型 Swift2.0中函数的返回值 根据是否具有返回值,函数可以分为无返回值函数和有返回值函数.以下将会对这两种函数类型进行讲解. Swift2.0中具有一个返回值的函数 开发者希望在函数中返回某一数据类型的值,必须要在函数声明定义时为函数设定一个返回的数据类型,并使用return语句进行返回.其中,return语句的一般表示形式如下: return 表达式 其中,表达式可以是符合Swift标准的任意表达式.而具有返回值的函数声明定义形式如下: fu

数组的键/值操作函数

PH在P中,数组的每个元素都是由键/值组成的,通过元素的键来访问对应的键的值.“关联数组”指的是键名为字符串的数组,“索引”和“键名”指的是同一样东西.“索引”多指数组的数字形式的下标.使用数组的处理函数,可以很方便地对数组中的每个元素的键和值进行操作,进而生成一个新数组. ①函数array_values() array_values()函数的作用是返回数组中所有元素的值.使用非常容易,只有一个必选参数,规定传入给定的数组,返回一个包含给定数组中所有值得数组.但不保留键名,被返回的数组将使用顺序

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象

今天学习内容有函数的返回值.函数参数的使用.名称空间与作用域.函数嵌套. 下来我们一一查看. 函数的返回值 看几个栗子: def func(x): return x**2 y=func(10) print(y) def foo(): return None res=foo() print(res) def foo(): return{'a':1} res=foo() print(res['a']) def foo(): return {'a':1},1,'a',[1,2] res=foo() p

#返回值包含函数

#返回值包含函数 def bar(): print('from bar') def foo(): print('from foo') return bar n = foo() n()

&lt;10&gt; 无参无返回值+ 无参有返回值函数的定义+有参无返回值函数定义+ 有参有返回值函数定义+函数的参数+函数的参数传递过程

无参无返回值: 1 #include <stdio.h> 2 3 4 /** 5 * 定义一个无参无返值函数 6 * 7 */ 8 void print_line(){ 9 10 printf("-----------------\n"); 11 12 } 13 14 15 16 int main(int argc, const char * argv[]) { 17 //调用函数 18 print_line(); 19 20 return 0; 21 } 无参有返回值函数

速战速决 (3) - PHP: 函数基础, 函数参数, 函数返回值, 可变函数, 匿名函数, 闭包函数, 回调函数

[源码下载] 作者:webabcd 介绍速战速决 之 PHP 函数基础 函数参数 函数返回值 可变函数 匿名函数 闭包函数 回调函数 示例1.函数的相关知识点 1(基础)function/function1.php <?php /** * 函数的相关知识点 1(基础) */ // 可以在相关的 function 声明语句之前调用该函数 f1(); function f1() { echo "f1"; echo "<br />"; } // 这里调用

使用在类中定义的有返回值的函数,如何得到执行结果反馈?

我们做开发时,程序执行完后最好会有个反馈结果,尤其是在庞大的程序中,如果有bug可以及时发现,不然很浪费时间...最近做sde的二次开发,创建数据集时要用到带有返回值的函数,因为在数据集上创建要素类需要用到这个数据集,声明一个全局变量,可以直接用这个返回值.但是在捕获错误方面受到了限制,因为有返回值的函数每一个节点都要有返回值,想直接得到反馈是不行的,想在方法执行后写结果反馈的代码是检测不到的. 只能向师傅求救,给我提供了两种方法解决,感觉很巧妙. 原来的代码: Form1中的代码: priva

函数深入理解---返回值为函数

返回值为函数 function fn1(arg){ //此时返回的是一个函数对象 var rel = function(num){ return arg + num; } return rel; //直接返回一个可以调用的函数 } //此时f是一个函数对象,可以完成调用 var f = fn1(20); console.log(f(20)); console.log(f(11)); ps.sort(sortByProperty('age')); function sortByProperty(p