精华内容
下载资源
问答
  • 2、将已有函数入口赋值给函数指针变量:fnPt = avg;3、使用指针变量调用函数:(*指针变量名)(参数);注意:看了一些参考资料里,声明函数指针时不用指定参数类型,但实际编辑时又提示指定参数类型才可以。例如例子中...

    C语言可以定义指针变量指向函数,通过指针来调用函数。

    使用:

    1、定义函数指针变量:  函数返回值类型(*指针变量名)();

    2、将已有函数入口赋值给函数指针变量:fnPt = avg;

    3、使用指针变量调用函数:(*指针变量名)(参数);

    注意:看了一些参考资料里,声明函数指针时不用指定参数类型,但实际编辑时又提示指定参数类型才可以。

    例如例子中的 int (*fnPt)(int*, int) = zhizhentest3_1_max;  这里就需要带上参数类型才行,否则编译时报错。

    例子:定义函数指针变量,将不同函数赋值给指针变量,调用函数。

    #include //求最大值

    int zhizhentest3_1_max(int* data, int len){

    int max = *data;//获取数组首地址对应的元素值

    //通过指针+1来获取下一个元素的地址

    for(int* p=data; p < data+len; p++){

    if(*p > max) max = *p;

    }

    return max;

    }

    //求平均值

    int zhizhentest3_2_avg(int* data, int len){

    int sum = 0;

    for(int* p=data; p < data + len; p++){

    sum +=*p;

    }

    return sum/len;

    }

    //函数指针变量作为函数参数

    void zhizhentest3_3_map(int* data, int len, int (*fn)(int)){

    for(int* p = data; p < data + len; p++){

    printf("%d, ", (*fn)(*p));

    }

    printf("\n");

    }

    //不变

    int zhizhentest3_4_nochange(int val){

    return val;

    }

    //求平方

    int zhizhentest3_5_square(int val){

    return val * val;

    }

    //求立方

    int zhizhentest3_6_cube(int val){

    return val * val * val;

    }

    //返回指针的函数

    int* zhizhentest3_7_map(int* data,int len, int (*fn)(int)){

    static int result[5];

    int i=0;

    for(int* p = data; p < data + len; p++){

    result[i++] = (*fn)(*p);

    }

    return result;

    }

    void zhizhentest3main(){

    int arr[5] = {4,7,2,3,9};

    int (*fnPt)(int*, int) = zhizhentest3_1_max;//定义返回值为int型的函数指针变量*fnPt,并将zhizhentest3_1_sum函数入口赋给fnPt

    int max = (*fnPt)(arr,5);//通过函数指针变量调用函数,传入参数

    printf("max=%d\n", max);

    fnPt = zhizhentest3_2_avg;//将zhizhentest3_2_avg函数入口赋给指针变量fnPt

    int avg = (*fnPt)(arr,5);

    printf("avg=%d\n", avg);

    printf("\n");

    printf("数组元素为:\n");

    zhizhentest3_3_map(arr,5,zhizhentest3_4_nochange);

    printf("元素求平方:\n");

    zhizhentest3_3_map(arr,5,zhizhentest3_5_square);

    printf("元素求立方:\n");

    zhizhentest3_3_map(arr,5,zhizhentest3_6_cube);

    printf("\n");

    int* result1 = zhizhentest3_7_map(arr,5,zhizhentest3_4_nochange);

    printf("返回的指针数组元素为:\n");

    for(int* p1 = result1; p1 < result1 + 5; p1++){

    printf("%d, ", *p1);

    }

    printf("\n");

    int* result2 = zhizhentest3_7_map(arr,5,zhizhentest3_5_square);

    printf("返回的数组平方元素为:\n");

    for(int* p2 = result2; p2 < result2 + 5; p2++){

    printf("%d, ", *p2);

    }

    printf("\n");

    int* result3 = zhizhentest3_7_map(arr,5,zhizhentest3_6_cube);

    printf("返回的数组立方元素为:\n");

    for(int* p3 = result3; p3 < result3 + 5; p3++){

    printf("%d, ", *p3);

    }

    printf("\n");

    }输出:

    e6af41045737fa8c8172f0a1b405d6cb.png

    展开全文
  • 规定了调用函数的参数列表,和返回值正向调用:通过window自带系统函数调用dll文件,获取dll文件中的函数地址,执行函数反向调用:通过函数指针,在另一个函数调用别的函数*/void main(){//正向调用//...

    //函数指针做函数参数

    #include

    #include

    #include

    #include

    /*

    函数指针做函数参数

    实现了2大功能:1.定义了一个指针类型,分配了4个字节大小的内存空间

    2.规定了调用函数的参数列表,和返回值

    正向调用:通过window自带系统函数库调用dll文件,获取dll文件中的函数地址,执行函数

    反向调用:通过函数指针,在另一个函数里调用别的函数

    */

    void main(){

    //正向调用

    //定义句柄----HINSTANCE头文件是Windows.h

    HINSTANCE hinstance;

    //定义函数指针类型

    typedef int(*SocketInitType)(void** /*out*/);

    typedef int(*SocketSendType)(void *, unsigned char *, int );

    typedef int(*SocketRevType)(void *, unsigned char **, int *);

    typedef int(*SocketDestory)(void **);

    int ret = ;

    void *handle=NULL;

    //准备发送报文

    char *sendstr = "dddddd";

    int buflen1 = strlen(sendstr) + ;

    //接受报文

    char *revstr = NULL;

    int buflen2 = ;

    //严重注意(第一次花费了半小时):在使用LoadLibrary宏定义的时候一定要设置字符集是未设置,不然c语言编译器不识别文件路径

    //具体设置:项目右键--属性--配置属性--常规--字符集--未设置

    hinstance = LoadLibrary("E:/L001.dll");

    if (hinstance==NULL)

    {

    printf("获取文件地址失败!\n");

    }

    //获取函数地址

    SocketInitType pf = (SocketInitType)GetProcAddress(hinstance, "cltSocketInit");

    if (pf==NULL)

    {

    printf("获取函数指针失败!\n");

    return;

    }

    SocketSendType pf2 = (SocketSendType)GetProcAddress(hinstance, "cltSocketSend");

    if (pf2 == NULL)

    {

    printf("获取函数指针失败!\n");

    return;

    }

    SocketRevType pf3 = (SocketRevType)GetProcAddress(hinstance, "cltSocketRev");

    if (pf3 == NULL)

    {

    printf("获取函数指针失败!\n");

    return;

    }

    SocketDestory pf4 = (SocketDestory)GetProcAddress(hinstance, "cltSocketDestory");

    if (pf4 == NULL)

    {

    printf("获取函数指针失败!\n");

    return;

    }

    ret = pf(&handle);

    if (ret!=)

    {

    printf("句柄初始化失败!\n");

    goto AAA;

    }

    ret = pf2(handle, (unsigned char*)sendstr, buflen1);

    if (ret!=)

    {

    printf("报文发送失败!\n");

    }

    ret = pf3(handle, (unsigned char**)&revstr, &buflen2);

    if (ret!=)

    {

    printf("报文接受失败!\n");

    }

    //打印接受的报文

    printf(revstr);

    //释放报文内存

    free(revstr);

    ret = pf4(&handle);

    if (ret != )

    {

    printf("释放句柄失败!\n");

    }

    AAA:

    system("pause");

    }

    f60de8798d3ba992fee63eab1e5b54fe.png

    C语言 函数指针三(反向调用)

    动态库代码 //简单的动态库开发----报文发送 #define _CRT_SECURE_NO_WARNINGS #include #include

    C语言:判断字符串是否为回文,-函数fun将单向链表结点数据域为偶数的值累加起来。-用函数指针指向要调用的函数,并进行调用。

    //函数fun功能:用函数指针指向要调用的函数,并进行调用. #include double f1(double x) { return x*x; } double f ...

    C语言函数指针&lpar;转载&rpar;

    二.通常的函数调用 一个通常的函数调用的例子:/* 自行包含头文件 */void MyFun(int x); /* 此处的声明也可写成:void MyFun(int) */int main(int a ...

    C语言函数指针 和 OC-Block

    C语言函数指针 和 OC-Block 一. C语言函数指针 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/2967037 ...

    C&num;委托与C语言函数指针及函数指针数组

    C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ...

    C语言函数指针基础

    本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础.如果你不讨厌事无巨细,请尽情阅读吧. 函数指针虽然在语法上让人有些迷惑,但不失为一种有趣而强大的工具.本文将从C ...

    深入理解C语言函数指针&lpar;转&rpar;

    本文转自:http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html 示例1: void myFun(int x); //声 ...

    &OpenCurlyDoubleQuote;对外部&lpar;局部&rpar;变量的访问”是C语言函数指针的最大弱点

    1.“对外部(局部)变量的访问”是C语言函数指针的最大弱点 . #include #include /* 结构体定义 */ struc ...

    Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...

    随机推荐

    GMap&period;Net开发之自定义Marker

    上一篇文章介绍了如何在WinForm和WPF中使用GMap控件,这篇介绍下GMap中Marker的使用. 自定义Marker,可以理解为在地图上自定义图标(Custom Marker),先看看GMap ...

    Servlet 利用Session实现不重复登录

    import java.io.IOException;import java.io.PrintWriter;import java.util.ArrayList;import java.util.It ...

    css 单行文本居中显示,多行文本左对齐

    父级元素 text-align:center; 自级元素 text-align:left; display:inline-block;

    selenium 使用xpath定位不到

    &lbrack;USACO17FEB&rsqb;Why Did the Cow Cross the Road II S

    题目描述 The long road through Farmer John's farm has  crosswalks across it, conveniently numbered  (). ...

    使用JDOM解析xml文档

    一.使用JDOOM解析xml文档 准备工作 1.下载JDOM.jar 包 解析代码如下 import org.jdom2.Attribute; import org.jdom2.Document; i ...

    23&period;HashMap

    HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据 ...

    http状态码204&sol;206&sol;200&sol;302&sol;303&sol;307

    HTTP的状态码有很多种,主要有1xx(临时响应).2xx(成功).3xx(已重定向).4xx(请求错误)以及5xx(服务器错误)五个大类,每个大类还对应一些具体的分类.平时我们接触比较多的是200. ...

    hbuilder header消失

    hbuilder的header在google浏览器中调试能正常显示,但是发布到app安装到手机后headr不显示.

    展开全文
  • 在C语言中调用函数交换两个数的数值是一个经典的问题。#includevoid swap(int x,int y);void main(){int a=3,b=4;swap(a,b);printf("a=%d,b=%d\n",a,b);}void swap(int x,int y){int t;t=x;x=y;y=t;}执行的结果,...

    在C语言中调用函数交换两个数的数值是一个经典的问题。

    #include

    void swap(int x,int y);

    void main()

    {

    int a=3,b=4;

    swap(a,b);

    printf("a=%d,b=%d\n",a,b);

    }

    void swap(int x,int y)

    {

    int t;

    t=x;x=y;y=t;

    }

    执行的结果,发现值是没有交换的。在这种情况下传给形参的是变量的值。传递是单向的,即如果在执行函数期间形参的值发生变化,并不传回给实参,这就是值传递方式。因为在调用函数期间,形参和实参不是同一个存储单元。在主函数中a ,b 对应的存储单元的值并没有发生什么变化。

    但是如果改用指针,这个问题就可以解决。

    #include

    void swap(int *x,int *y);

    void main()

    {

    int a=3,b=4;

    swap(&a,&b);

    printf("a=%d,b=%d\n",a,b);

    }

    void swap(int *x,int *y)

    {

    int t;

    t=*x;*x=*y;*y=t;

    }

    这是因为,使用指针,传递的是a ,b的地址,调用函数,从而改变了地址a,b中的数值。

    如果想要改变指针值,传递指针参数,这样也是出现问题,如下面的例子:

    #include

    void fun(int *ptr)

    {

    int i;

    int a[10];

    for(i=0;i<10;i++)

    {

    a[i]=i;

    }

    ptr=a;

    }

    int main()

    {

    int *b=NULL;

    fun(b);

    printf("%d\n",b[4]);

    }

    例子中传递的是指针b,在函数fun()中,将数组a的地址赋给b,在返回后同样没有改变指针b的值(b中存储的是地址,是一个指针)。在这种情况下,如果采用二重指针,就能够改变指针b的内容,是b指向数组a的起始地址。修改后的程序如下:

    #include

    void fun(int **ptr)

    {

    int i;

    int a[10];

    for(i=0;i<10;i++)

    {

    a[i]=i;

    }

    *ptr=a;

    }

    int main()

    {

    int *b=NULL;

    fun(&b);

    printf("%d\n",b[4]);

    }

    这是因为,函数中传递的是指针b的地址,通过*ptr将b中的内容赋值为数组a的地址,从而实现目标。

    可以总结为一句话,在函数参数传递中,如果要改变实参的值,就必须传递实参的地址。比如,实参是一个数值,就要传递数值的地址,被调用函数中的形参就是一维指针;如果实参是一维指针,被调用函数中的形参就需要是二重指针。牢记,调用函数期间,形参和实参不是同一个存储单元。

    展开全文
  • 在C中这里我们常用的指针,数组及函数了,这些东西其实我们就是使用了书上的内容自己理解一番,做个连贯的笔记罢了,希望这些例子对各位理解数组,函数指针会有所帮助。例子 代码如下 复制代码 #include #define ...

    在C中这里有我们常用的指针,数组及函数了,这些东西其实我们就是使用了书上的内容自己理解一番,做个连贯的笔记罢了,希望这些例子对各位理解数组,函数和指针会有所帮助。

    例子

     代码如下复制代码

    #include

    #define SIZE 4

    int main(void)

    {

    short dates[SIZE];

    short * pti;

    short index;

    double bills[SIZE];

    double * ptf;

    pti = dates;

    ptf = bills;

    printf("#s sn", "short", "double");

    for (index = 0; index < SIZE; index )

    printf("pointers %d: p pn", index, pti index, ptf index);

    return 0;

    }

    首先:

    在C中,对一个指针加1的结果就是对该指针增加一个储存单元,对鼠族而言,地址会增加到下一个元素的地址,而不是下一个字节。

    于是乎,我们可以看到他的地址被输出了:

     代码如下复制代码

    short double

    pointers 0: 0028FF0C 0028FEE8

    pointers 1: 0028FF0E 0028FEF0

    pointers 2: 0028FF10 0028FEF8

    pointers 3: 0028FF12 0028FF00

    关于为何不同,其实是因为short和double占的字节数是不一样的。(short使用两个字节,double则是八个)

    * (dates 2)与*dates 2并不同,因为*的优先级高于*,所以会优先运算,相当于对dates当前指向的值加了2.

    再来看看另一个:

     代码如下复制代码

    #include

    #define MONTHS 12

    int main(void)

    {

    int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int index;

    for (index = 0; index < MONTHS; index )

    printf("Month - has %d days.n", index 1, * (days index));

    return 0;

    }

    可以看到* (days index)其实和days[index]是一个效果的。

    在函数中,我们可以这么传入数组int sum(int * ar),但是这样只能得到首元素的地址,却不知道数组个数(自然我们能把数组个数当成第二个参数传入),还可用int ar[]代替,这是指向数组的指针,是一个指针(因为重要所以说两遍),为什么强调这一点,看这个程序就知道了:

     代码如下复制代码

    #include

    #define SIZE 10

    int sum(int ar[], int n);

    int main(void)

    {

    int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};

    long answer;

    answer = sum(marbles, SIZE);

    printf("The total number of marbles is %ld.n", answer);

    printf("The size of marbles is %lu bytes.n", sizeof marbles);

    return 0;

    }

    int sum(int ar[], int n)

    {

    int i;

    int total = 0;

    for (i = 0; i < n; i )

    total = ar[i];

    printf("Te size of ar is %lu bytes.n", sizeof ar);

    return total;

    }

    来看看输出:

    Te size of ar is 4 bytes.

    The total number of marbles is 190.

    The size of marbles is 40 bytes.

    调用函数的时候输出的是4,这是因为函数内,它并非是一个数组,只是一个int类型的指针,int类型为4个字节,而在main中,数组本身由10个int类型的数组成,所以是40。

    请随时记得:* (days index)其实和days[index]是一个效果的

    除了指定数组大小外,还有什么办法指定:

     代码如下复制代码

    #include

    #define SIZE 10

    int sump(int * start, int * end);

    int main(void)

    {

    int marbles[SIZE] = {20, 10, 5, 39, 4, 16, 19, 26, 31, 20};

    long answer;

    answer = sump(marbles, marbles SIZE);

    printf("The total number of marbles is %ld.n", answer);

    return 0;

    }

    int sump(int * start, int * end)

    {

    int total = 0;

    while (start < end)

    {

    total = *start;

    start ;

    }

    return total;

    }

    答案是一样的,因为索引从0开始,所以marbles SIZE指向数组结尾后下一个元素(再往后结果是未知的)。

    展开全文
  • 本文将带你了解C语言编程入门之c语言函数指针的用法和例子,希望本文对大家学C语言有所帮助。1.基本定义c语言函数指针的定义形式:返回类型(*函数指针名称)(参数类型,参数类型,参数类型,…);c++函数指针的定义形式...
  • 利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一个引用或者指针调用函数来实现。如下面所示: Class ...
  • (1)将各函数生成so动态库(2)主函数中调用dlopen、dlsym、dlclose等函数例子:#define FUNCPARA (ST_HASHTABLE*,short, unsigned char*, short*,unsigned char*, unsigned short, unsigned char, char ,char, char,...
  • 返回指针值的函数1 返回值为指针型数据的函数,定义一般的形式为:...返回指针值的函数例子与调试呢,我就不写了,因为我觉得这个还是非常简单的了。我重点写下面的知识点,指向函数指针。指向函数指针为什么...
  • 说明:指针可以不但...可以用一个指针变量指向函数,然后通过该指针变量调用函数。定义指向函数指针变量的方法是:int (*p) (int ,int );int【指针变量p指向的函数的类型】 (*p)【p是指向函数指针变量】 ( ...
  • C语言中,指针可以和函数结合使用,可以返回一个指针,叫做指针函数。...若有函数max(),设其代码被装载到了如下图的位置,则每次调用max()函数时都要从2068处开始执行代码,该地址(2068)称为函数max(...
  • C/C++ 函数调用方式与栈原理是 C/C++ 开发必须要掌握的基础知识,也是高级技术岗位面试中高频题。我真的真的真的建议无论是使用 C/C++ 的学生还是广大 C/C++ 开发者,都该掌握此回答中所介绍的知识。 如果你看不懂...
  • java中函数,但是没指针,那也许会这样的问题,那java是怎么实现多态的?java中可以肯定是函数的,而且 们如果不申明为final形他默认就是虚函数.不用vitual申明."in java, you do not need to declare a method...
  • 在使用VC进行函数定义时,通常会指定该函数调用方式,那么在C语言中函数调用方式什么区别呢?下面小编找到了一下教程,分享给大家,希望可以帮助到大家。通常在使用VC进行函数定义时会指定该函数调用方式,诸如:...
  • 往往,我们一提到指针函数函数指针的时候,就很多人弄不懂。下面就由小编详细为大家介绍C语言中函数指针指针函数函数指针之间的区别。c语言指针函数定义:函数指针是指向函数指针变量。 因此“函数指针”...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼为了增加参数调用的灵活性,可以利用结构体指针传递多个不同的参数进入C语言函数体。最著名的例子就是用Win32APIHANDLE CreateThread(LPSECURITY_...
  • C语言函数指针变量

    2021-05-20 12:09:09
    C语言函数指针变量导语:在C语言中规定,一个函数总是占用一段连续的内存区, 而函数名就是该函数所占内存区的首地址。 这就是函数指针变量。...然后通过指针变量就可以找到并调用这个函数。 我们把这种指向函...
  • 当我们想写一个函数来实现数值交换的时候,很可能会这样代码: #include <stdio.h> void swap(int x, int y) { int t = x; x = y; y = t; } int main() { int a=3, b=5; swap(a, b); printf("%d %d...
  • 指针函数的关系

    2021-05-22 07:56:30
    Wanghaha2333参考文章指针函数的关系1、函数指针(指向函数指针)一个函数在编译之后,会占据一部分内存,而它的函数名,就是这段函数的首地址。可以把一个指针声明成为一个指向函数指针。C 语言规定函数名会被...
  • 没法解答呀~ 汗~指针比较很多种情况,要看具体例子。我去,这书上描述得这么复杂。函数指针最常用的地方,是作为 callback(回调函数),比如:typedef void (*FUNC_POINTER)(int errcode, FileResult result);void ...
  • 函数名与函数指针

    2021-02-09 14:45:21
    一 、通常的函数调用 //自行包含头文件 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun(10); //这里是调用MyFun(10);函数 return 0; } void MyFun(int x...
  • 程序中定义了一个函数,在编译时,编译系统会为函数代码分配一段存储空间,这段存储空间的起始地址称为这个函数指针。关于系统为函数分配内存的情况,度娘的答案如下:当源码被编译成二进制文件后,其中的变量,...
  • 1. 首先,在C语言中函数是一种function-to-pointer的方式,即对于一个函数,会将其自动转换成指针的类型.代码如下:#includevoid fun(){}int main(void){printf("%p %p %pn", &fun, fun, *fun);return 0;}----------...
  • 指向对象成员函数指针 对象的成员函数是一个函数,那么,我们可以定义一个函数指针,指向对象的成员函数。但是,该函数指针变量的...所以,它可以指向一个函数,并通过函数指针调用函数,如下: pf = func;...
  • 1.函数指针指针函数(1) 函数指针 即指向这个函数指针,定义为 数据类型 (*fun)(参数列表) ,()的优先级比*高,所以*fun加括号。如 void (*fun)(int*,int*);(2)指针函数 即返回值是指针函数,定义为 数据类型 * ...
  • C语言函数调用方式分享在C语言中函数的调用非常实用,如何调用函数成为常见的问题。大家知道C语言函数调用方式吗?通常在使用VC进行函数定义时会指定该函数调用方式,诸如:int __stdcall max(int a, int b){return a...
  • C语言函数指针的用法

    2021-05-21 10:53:48
    函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数...
  • 指针函数返回值是一个指针,就称为指针函数,是一个函数#inlcudechar *getWord(char c){switch(c){case 'A':return "Apple";case 'B':return "Banana";case 'C':return "Cat";case 'D':return "Dog";default: return...
  • C++高阶 成员函数指针例子小记

    千次阅读 2021-05-22 15:54:01
    下面展示了成员函数,虚函数、静态成员函数转成函数指针调用方法, #include <iostream> using namespace std; class A { public: static void staticMethod(){cout<<"static"<<endl;} //...
  • 也为了让面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对C语言、iOS开发不感兴趣,请忽略前言前面我们花了接近3个章节学习指针,应该都感受到指针的强大了吧。指针可以根据地址...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 331,818
精华内容 132,727
关键字:

有函数调用的指针例子