精华内容
下载资源
问答
  • 指针数组 首先从名字就可以知道这是一个数组,是存放指针数组。 先看几种指针数组: int * 数组指针 函数指针 函数指针数组 指向函数指针数组指针

    指针数组

    首先从名字就可以知道这是一个数组,是存放指针的数组。
    先看几种指针数组:
    int *arr1[10];
    char *arr2[5];
    char **arr3[6];
    因为 [ ] 的优先级是高于 * 的,所以数组名会先于 [ ] 相结合组成数组。 再于 int * / char *类型结合,组成存放该类型的数组。



    指针数组因为存放的都是指针所以不管是 int *   char * 还是 char ** 其大小都是四个字节。

    数组指针

    从名字看就知道是指针,是指向一个数组的指针。

    int (*p)[10];
    char (*p)[10];
    由数组指针知道 [ ] 的优先级是高于 *  的,所以用()来提升指针先结合。

    int (*p)[10];  //  是一个指向10个整形的一维数组的指针
    char (*p)[10]; //  是一个指向10个字符型的一维数组的指针

    数组的存储方式



    因为指向的是一个数组,所以大小由数组决定


    函数指针

    指向函数的指针,通俗的说也就是函数的地址
    void(*pfun)();
    pfun 先和*结合,说明pfun是指针,指针指向的是一个函数,指向的函数无参数,返回值类型为void
    也就是说 其可以保存函数的地址



    函数指针数组

    int (*parr[3])();
    parr先与 [ ]结合,说明是一个数组,再与*结合,说明数组存放的是指针,指针都指向的是函数
    函数指针数组的使用(转移表)
    例子:计算器
    #include<stdio.h>
    
    int add( x, y)
    {
    	return x + y;
    }
    int sub(x,y)
    {
    	return x - y;
    }
    int mul(x,y)
    {
    	return x * y;
    }
    int div(x,y)
    {
    	return x / y;
    }
    int main()
    {
    	int x, y;
    	int input = 1;
    	int ret = 0;
    	int(*parr[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
    	while (input)
    	{
    		printf("*******************************\n");
    		printf("***** 1.add         2.sub *****\n");
    		printf("***** 3.mul         4.div *****\n");
    		printf("*******************************\n");
    		printf("请选择:");
    		scanf("%d", &input);
    		if ((input > 0 && input < 5))
    		{
    			printf("输入你要计算的数:\n");
    			scanf("%d  %d", &x, &y);
    			ret = (*parr[input])(x, y);
    		}
    		else
    			printf("输入有误!\n");
    		printf("%d\n", ret);
    	}
    	return 0;
    }
    输出结果:


    指向函数指针数组的指针 

    这是一个指针,指向一个数组,这个数组是一个函数指针数组,数组中的元素都是函数指针

    定义方式:

    #include<stdio.h>
    void test(const char *str)
    {
    	printf("%s\n", str);
    }
    int main()
    {
    	void (*pfun)(const char*) = test;
    	//函数指针pfun
    	void (*pfunArr[5])(const char* str);
    	//函数指针的数组pfunArr
    	void (*(*ppfunArr)[10])(const char* str) = &pfunArr;
    	//指向函数指针数组pfunArr的指针ppfunArr
    	return 0;
    }




    展开全文
  • 详解C语言指针函数、函数指针、函数指针数组

    万次阅读 多人点赞 2018-07-09 11:08:24
    而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。 1. 指针函数 指针函数就是返回指针值...

    在C语言中,指针是一个很重要但是又很容易弄错的概念,也可以说指针就是C语言的灵魂,所以说学好指针对于完全掌握C语言是一个必须的过程。而在指针中,指针函数、函数指针、指针函数数组、函数指针数组、指向函数指针数组的指针等等概念看着又绕又头疼。本问总结了一下以上一些概念以及用法,并给出例程深化理解。

    1. 指针函数

    指针函数就是返回指针值的函数,本质是一个函数。所以指针函数等价于“返回值为指针的函数”。

    声明形式:type *func (参数列表)

    #include <iostream>
    using namespace std;
    
    
    int *GetNum(int x); //指针函数声明形式
    
    
    void main(void)
    {
        cout << "===============start================" << endl;
        int num;
        cout << "Please enter the number between 0 and 6: ";
        cin >> num;
        cout << "result is:" << *GetNum(num) << endl;    //输出返回地址块中的值
        system("pause");
    }
    
    int *GetNum(int x) {
        static int num[] = { 0,1,2,3,4,5,6 };
        return &num[x];  //返回一个地址
    }
    

    2. 函数指针

    函数指针就是一个指向函数的指针。每个函数在编译时,会被分配一个入口地址,一般用函数名来表示,这个地址就是该函数的指针。

    声明形式:type (*func)(参数列表 )

    从上面的定义形式可以看出,函数指针和指针函数的直观上区别在于指针符号*与函数名/指针名有没有用括号()包裹起来,从这一点来看是很容易区分两者的。

    #include <iostream>
    using namespace std;
    
    int max(int a, int b) {
        return a>b ? a : b;
    }
    
    void main(void)
    {
        cout << "===========start===========" << endl;
        int(*func)(int, int);       //定义一个指向该函数形式的指针变量
        func = max;
        int a, b;
        cout << "Please enter two numbers:";
        cin >> a >> b;
        cout << "max=" << (*func)(a, b) << endl;    //运用指针变量调用函数
        cout << "max=" << max(a, b) << endl;        //使用原函数调用
        cout << "max=" << func(a, b) << endl;       //使用函数指针名调用,func = max
        system("pause");
    }
    

    上例给出了函数指针的两种最普遍的调用形式,一个是直接用定义的指针变量(* func)调用,一个是用指针名调用,后者看起来就像是将原函数使用了新名称去调用一样,可以看成函数的别名。再次强调一下:指针变量名和指针符号 * 一定要用括号包裹起来。函数指针还有一种常用的使用方式,就是使用typedef定义后再使用。将上例稍作修改如下:

    #include <iostream>
    using namespace std;
    
    int max(int a, int b) {
        return a>b ? a : b;
    }
    
    typedef int(*func)(int, int);
    
    void main(void)
    {
        cout << "===========start===========" << endl;
        func maxfunc = max;
        int a, b;
        cout << "Please enter two numbers:";
        cin >> a >> b;
        cout << "max=" << (*maxfunc)(a, b) << endl; //运用指针变量调用函数
        cout << "max=" << max(a, b) << endl;        //使用原函数调用
        cout << "max=" << maxfunc(a, b) << endl;        //使用函数指针名调用,func = max
        system("pause");
    }
    

    3. 函数指针数组

    顾名思义,就是每个元素都是函数指针的数组,直接在函数指针名后面加上数组符号[ ]即可。

    声明形式:type (*func[ ])(参数列表 )

    #include<iostream>
    using namespace std;
    
    void fun1()
    {
        cout << "调用函数fun1" << endl;
    }
    void fun2()
    {
        cout << "调用函数fun2" << endl;
    }
    void fun3()
    {
        cout << "调用函数fun3" << endl;
    }
    int main()
    {
        //定义三个函数指针
        void(*pfun)() = &fun1;
        void(*pfun2)() = &fun2;
        void(*pfun3)() = &fun3;
        //接下来就是定义一个数组把他们三个装进去。
        void(*pfunarr[3])();
        void(*pfunarr[3])();
        pfunarr[0] = pfun;
        pfunarr[1] = pfun2;
        pfunarr[2] = pfun3;
        /*  或者这样赋值
        pfunarr[0] = &fun1;
        pfunarr[1] = &fun2;
        pfunarr[2] = &fun3;
        */
        //调用运行
        pfunarr[0]();
        pfunarr[1]();
        pfunarr[2]();
        /*  或者这样调用
        (*pfunarr[0])();
        (*pfunarr[1])();
        (*pfunarr[2])();
        */
        system("pause");
        return 0;
    }
    

    4. C语言函数不可以定义为数组,只能通过函数指针来操作定义函数指针数组。

    5. 指向函数指针数组的指针

    声明形式:type (* (*func )[ ])(参数列表 )

    #include<iostream>
    using namespace std;
    
    void fun1()
    {
        cout << "调用函数fun1" << endl;
    }
    void fun2()
    {
        cout << "调用函数fun2" << endl;
    }
    void fun3()
    {
        cout << "调用函数fun3" << endl;
    }
    int main()
    {
    
        //void(*pfun)() = &fun1;
        //void(*pfun2)() = &fun2;
        //void(*pfun3)() = &fun3;
        //接下来就是定义一个数组把他们三个装进去。
        void(*pfunarr[3])();
        void(*(*pfunarr2)[3])();
        //在这里呢看着个指针数组,他就是一个具有3个以函数指针为内容的元素的函数指针数组。
        pfunarr[0] = &fun1;
        pfunarr[1] = &fun2;
        pfunarr[2] = &fun3;
    
        pfunarr2 = &pfunarr;
        (*pfunarr2)[0]();
        pfunarr[0]();
        system("pause");
        return 0;
    }
    

    分析其定义形式:void(*(*pfunarr2)[3])()
    其中(* pfunarr2)[3]表示数组指针,而void(* )( )表示函数指针,两者结合起来就是指向函数指针数组的指针。

    展开全文
  • 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组指针

    一、指针数组与数组指针先看两行代码,猜猜哪个是数组,哪个是指针

    int *p[5];

    int (*p)[5];

    有没有很简单,但是有很多初学者很是分不清楚;第一个是指针数组,第二个是数组指针。且看小僧给大家捋一捋,首先要明白符号优先级问题,“[ ]”的优先级高于“*”,所以p先和谁结合就表示谁。"int *p[5]" p先和[ ]结合,理所当然是数组了,只不过数组元素为 int * 型;"int (*p)[5]" “()”的优先级高于“[ ]”,p先和“*”结合,理所当然是指针,只不过该指针指向 int 型数组的内容,是不是搜一贼。

    指针数组:首先他是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。

    数组指针:首先他是一个指针,他指向一个数组。是不是很难懂,且看下图

    希望你们看了不会太晕

    二、函数指针,函数指针数组

         函数指针,看到这里你肯定会照猫画虎,(首先他是一个指针,他指向一个函数)很对,就是这样的。接下来我们细细研究,先看张图

    来几片代码瞧一瞧

    (1) char *(*fun1)(char *p1,char *p2);(2) char * *fun2(char p1,char p2);

    有没有很复杂的样子,第一题看起来像函数,其实他是函数指针,fun1是指针变量,他指向一个函数。这个函数有两个指针类型的参数,返回值为 char * 型;第二题看起来像指针,其实他是一个函数,fun2是函数名,参数为两个指针,返回值为 char 型二级指针。 函数指针也很简单吧,其实他和普通指针一样,我们使用他的好处在于,可以将实现同一功能的多个模块统一起来标识,这样可以使函数的接口与实现分开。

    三、函数指针数组,函数指针数组指针有了上面了的基础我们很容易掌握这两个

    函数指针数组:首先它是一个数组,数组元素为函数指针。(不干说,还是来个栗子:char *(* a[4])(char *p);它是一个数组,数组名为 a ,数组内有四个指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。)

    函数指针数组指针:首先它是一个指针,这个指针指向数组,这个数组里面存的都是指向函数的指针。(不怕,来个栗子就好了:char (*(* a)[4])(char *p); 这个指针指向包含了4个元素的数组;这个数组里面存的是指向函数的指针;这个指针指向一些返回值类型为指向字符的指针,参数为指向字符的指针的函数。

    来个例子看看他们的威力:

    #include <stdio.h>
    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 div(int a, int b)
    {
    	return a / b;
    }
    int main()
    {
    	int x, y;
    	int input = 1;
    	int ret = 0;
    	int(*p[5])(int x, int y) = { 0, add, sub, mul, div }; //转移表
    		while (input)
    		{
    			printf( "*************************\n" );
    			printf( " 1:add 2:sub \n" );
    			printf( " 3:mul 4:div \n" );
    			printf( "*************************\n" );
    			printf( "请选择:" );
    			scanf( "%d", &input);
    			if ((input <= 4 && input >= 1))
    			{
    				printf( "输入操作数:" );
    				scanf( "%d %d", &x, &y);
    				ret = (*p[input])(x, y);
    			}
    			else
    				printf( "输入有误\n" );
    			printf( "ret = %d\n", ret);
    		}
    		return 0;
    }
    这计算器还可以吧,看看运算结果如何


    四、叨叨几句,不要看起来很复杂,其实学起来也复杂,但是学懂了会很有赶脚。
    好好学习,天天向上大笑
    初学者欢迎大家指正吐舌头

    展开全文
  • 编译环境:GCC 示例说明:定义三个参数为void返回值为void的函数;(函数) 定义三个指向void型参数返回值为void的函数指针;(指针) 定义一个保存指向void型参数... 给函数指针赋值、给函数指针数组赋值; ...

    编译环境:GCC

    示例说明:定义三个参数为void返回值为void的函数;(函数)

                      定义三个指向void型参数返回值为void的函数指针;(指针)

                      定义一个保存指向void型参数返回值为void的函数指针的数组;(数组)

                      给函数指针赋值、给函数指针数组赋值;

                      通过函数指针调用函数、通过函数指针数组调用函数;

                      p_arry+1含义:数组中的首元素;

                      *(p_arry+1)含义:数组中的首元素中的内容,当然其中的内容就是一个函数指针;

                      (*(p_arry+i))() 含义:调用数组中函数指针指向的函数;等价于p1();

     

    #include "stdio.h"

    void fun1(void)
    {
        printf("fun1 \r\n");    

    void fun2(void)
    {
        printf("fun2 \r\n");    
    }
    void fun3(void)
    {
        printf("fun3 \r\n");    
    }

    int main()
    {    
        int i=0;
        void (*p1)(void)=NULL;
        void (*p2)(void)=NULL;
        void (*p3)(void)=NULL;    
        void(*p_arry[3])(void)={NULL,NULL,NULL};
        p1=fun1;
        p2=fun2;
        p3=fun3;
        p_arry[0]=p1;
        p_arry[1]=p2;
        p_arry[2]=p3;
        for(i=0;i<3;i++)
        {
            (*(p_arry+i))();
        }
        printf("*************************\r\n");
        p1();
        p2();
        p3();
        return 0;
     } 

     

    展开全文
  • 函数指针(指向函数指针) 与数据项类似,函数也有自己的地址。函数的地址是存储其机器代码的内存的开始地址。例如,可以编写将另一个函数的地址作为参数的函数,这样第一个函数将能够找到第二个函数,并运行它。...
  • 前述:C语言的奥秘,博大精深,今天来回忆的分析函数指针函数指针数组的用法。具体请见下面一个注册程序的实现。 1 #include &lt;stdio.h&gt; 2 #include &lt;string.h&gt; 3 5 6 typedef ...
  • 指针可以用于数组、或作为函数的参数,用来访问内存和对内存的操作,指针的使用使得C++很高效,但是指针也非常危险,使用不当会带来比较严重的问题。 1、指针 程序中所有的变量和常量都存在一个内存地址中,当然,...
  • 函数指针函数指针是指向可执行代码段或调用可执行代码段的信息块的指针,而不是指向某种数据的指针函数指针是将函数当做普通数据那样存储和管理。函数指针有一种固定的形式,就是包含一个确定的返回值类型和若干...
  • 函数指针数组示例

    2014-10-11 13:33:05
    C语言中对函数指针数组不是很了解,老师最近布置了一个作业,就搜集资料写了一个,希望能给大家启发,如果对C语言复杂指针的分析不是很懂得话,可以网上搜索“右左法则”
  • 函数指针函数指针数组函数指针数组指针

    千次阅读 多人点赞 2017-11-27 11:39:51
    数组指针 概念:数组指针指针,只要是指针他就占4个字节; 例如: 整形指针:int *p;能够指向整形数据的指针  浮点型指针:float *p;能够指向浮点型的数据的指针 那么数组指针,同样的理解就是指向数组指针...
  • 数组:一组数据的集合...当然数组中除了存储一般常见的数据类型外,也可以用来存放指针,此时的数组就叫指针数组指针数组指针数组的元素全为指针。它的声明方法是:数据类型 * 数组名[数组长度];例如int arr[5];
  • 本文首先给出 指针相关概念 的预备知识, 即,指针的四个概念 与 相关符号 表示。而后,给出 各个 指针的 相关声明方式 。最后 ,本文给出 4 个 指针 相关概念的联合实例 与 输出。
  • 函数指针: 在c语言中,一般函数都是占用一段连续的内存区,而函数名就是这段连续内存区的首地址,而且指针也代表着地址。所以,我们可以吧函数名(函数首)赋值给指针变量,用指针来调用这个函数。 格式:int (*p...
  • 怎样定义函数指针数组

    千次阅读 2018-11-22 20:25:33
    有时候我们如果需要在一个循环中,每次调用不同的函数(这些函数的返回值和参数相同,函数名不同,实现不同),那么就可以使用函数指针数组来使代码更加简练和易读。那么,怎样定义函数指针数组呢? 一、什么是函数...
  • 引子:数据在内存中是如何存储的,又是如何读取的?...地址、指针指针变量都称为指针。一、变量的地址(指针)和指向变量的地址变量(指针)1.概念:变量的指针: 就是变量的地址。指针变量: 是用来存放地...
  • 首先有个问题:指针数组有什么关系呢? 答案:什么关系都没有。 指针就是指针,在32位平台下,永远占4个字节,其值为某一个内存的地址。 数组就是数组,其大小与元素的类型和个数有关。定义数组时必须指定其...
  • 指针函数:返回值为指针的函数指针函数:返回值为指针的函数 函数指针:只想函数的指针 函数指针数组:存放函数指针的数组 2、是什么样子 指针函数: 数据类型 * 函数名 (参数); 例: 返回值为int型指针的函数,...
  • 五、指向函数指针数组指针 目录 1.指针数组 2.数组指针 3.函数指针 4.函数指针数组 5.函数指针数组指针 一、指针数组 1.是一个存放指针数组 2.举一个栗子 int *arr[10]; char *arr2...
  • 一、函数指针数组1.1函数指针数组的声明 函数指针数组的声明如下,所谓函数指针数组就是在之前的函数指针的基础上增加了[],由于[]的优先级高于*,故 pf先与[]结合,说明它是一个数组,再与*结合说明数组中的元素的...
  • C语言中,我们知道,指针变量一种特殊的变量,专门用来...指针数组数组指针函数指针函数指针数组、指向函数指针数组指针 1.指针数组  指针数组强调的是数组,并且数组元素是指针类型 例:int *arr[5]//ar
  • 上一篇博客最后的两个例子的答案分别是:函数指针数组函数指针数组指针函数指针数组指针和前面的数组指针其实没有太大区别。然后今天主要理一下函数指针数组和二级指针函数指针数组 函数指针数组中,...
  • 今天小编就为大家分享一篇C语言数组元素的循环移位方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 理解函数指针和定义 先看一下一段代码: #define _CRT_SECURE_NO_WARNINGS 1 #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void test() { printf("hehe\n"); } int main...
  • 在c语言函数调用中用指针操作数组

    千次阅读 2020-08-18 17:23:07
    直接上代码 #include using namespace std; int p[20]; void change(int *p){ for(int... } 输出为 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 如果你传入的指针指向的是一个数组,在函数体中就可以直接用数组下标等操作
  • C++函数指针数组的使用方法

    千次阅读 2015-11-24 20:30:49
    什么情况下,想到将函数指针数组来的呢?是由于近期写的一个程序中,有一系列顺序化的函数,且这些函数的形式基本一致,需要对每一步的执行结果进行判断,是否执行成功,若执行成功,则继续执行下一函数,如果执行...
  • 本文介绍的函数指针以及函数指针数组解决了实际程序编写过程中遇到的当在多种情况情况下调研多个函数的问题。
  • 总结指针数组部分的相关知识自己写的一遍博客: 指针是变量单元的地址,地址指向该变量单元,因此地址形象的称为“指针”,通过指针(地址)可以找到内存单元。  (总结)1.指针是存放地址才出现的,地址是为了...
  • 使用函数指针数组建立一套bpm工作流框架。这套框架在各种oa以及某几个大型通信公司应用的很广泛 适应场景 多分枝(类似Swtich)条件下、处理函数的形参列表和返回类型相同。如: int func1(const char *...
  • c语言利用指针数组的最大值与最小值,下载资源,数组可扩展。
  • 指针数组函数形参

    千次阅读 2018-10-23 13:43:00
    在设计函数过程中,想要函数参数传入一个指针数组,多为字符串数组,在函数形参的设计上有两种思路,具体以下列两种应用场景为说明 一、字符串处理函数strsort 从程序设计角度来看,将多个字符串传递给函数处理时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 630,758
精华内容 252,303
关键字:

指针函数数组