函数指针,堆栈



函数指针的特点

  1. 定义指向函数的指针变量的一般形式为数据类型(*指针变量名)(函数参数列表);

    如int (*p)(int,int);

  2. 注意:对于函数指针来说p+n,p++,p—等运算无意义。
  3. 案例如下:

    #include<stdio.h>

    #include<stdlib.h>

     

    intadd(inta,intb){

    returna
    +b;

    }

     

    intmul(inta,intb)

    {

    returna*b;

    }

    voidmain()

    {

    printf("%d",add(1,
    2));

    printf("\n%p",add);

     

    //指针存储函数地址,存储了类型

    int(*p)(inta,intb)
    =add;  

    printf("\n%d\n",p(3,
    4));

     

    p
    = mul;    //p是一个变量,所以可以任意等于想要的值。

    printf("\n%d\n",p(3,
    4));

    //add = mul;    //这里是错的代码,add位常量。

     

    system("pause");

    }

  4. 查看函数地址:

  1. malloc,自动分配内存

    #include<stdio.h>

    #include<stdlib.h>

    #include<Windows.h>

     

    _declspec(dllexport)voidmsg()

    {

    while
    (1)

    {

        MessageBoxA(0,"百度CEO李彦宏邀请你共进晚餐","baidu",
    0);

            malloc(1024 * 1024 * 100);

        Sleep(10000);

    }

    }

     

    _declspec(dllexport)voidgo()

    {

    while
    (1)

    {

        malloc(1024
    * 1024 * 100);

        Sleep(1000);

    }

    }

6、堆上的内存,除非自己回收,否则不会回收。使用free()函数释放内存。

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

 

voidmain()

{

   while
(1)

   {

       void
*p =
malloc(1024 * 1024 * 100);

       Sleep(2000);

       free(p);  //通过free释放内存

       Sleep(6000);

   }

}

  1. 修改程序中的堆栈内存的方式。右击项目à属性à链接器à系统à修改堆栈保留大小。
  2. 栈的特点:容量有限。堆中的内存不可以释放,要手动释放。
  3. malloc卡内存,栈卡cpu。

 

时间: 2024-09-23 17:23:51

函数指针,堆栈的相关文章

成员函数指针与高性能的C++委托 (Member Function Pointers and the Fastest Possible C++ Delegates)

标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做"闭包(closure)"或"委托(delegate)")在一些语言中已经证明了它宝贵的价值.在Delphi (Object Pascal)中,面向对象的函数指针是Borland可视化组建库(VCL,Visual Component Library)的基础.而在目前,C#使"委托"的概念日趋流行,这也正显示出C#这种语言的成功.在很多应用程序中,&qu

C#委托所蕴含的函数指针概念详细解析_C 语言

原则: 1.函数指针,实际上是函数编码后的指令在内存中的首地址,在C++/C中,这个地址可以用函数名直接使用 一个函数调用另一个函数的时候,就可以把被调用函数以函数指针的形式作为参数传入 2.回调函数callback使用的技术就是函数指针: 回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用.为此,你需要做三件事: 1). 声明: 2). 定义: 3). 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用. 回调函数是应用程序提供给Windo

编程算法:求1+2+...+n(函数指针) 代码(C++)

题目: 求1+2+...+n, 要求不能使用乘除法\for\while\if\else\switch\case等关键字及条件判断语句(A?B:C). 可以使用函数指针求解, 通过递归调用, 每次递归值减1, 使用求反运算(!), 即非0为0, 0为1. 代码: /* * main.cpp * * Created on: 2014.7.12 *本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/ * Aut

谈函数指针(全局/类成员函数)和函数对象

函数指针(全局函数/类成员函数).函数对象(Function object) 一. 函数指针类型为全局函数. #include "stdafx.h"#include <iostream>using namespace std;class TestAction;typedef void (*fp)(int); void Drink(int i){ cout<<"No. "<<i<<" drink..."

声明函数指针并实现回调

程序员常常需要实现回调.本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调.注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论). 声明函数指针 回调函数是一个程序员不能显式调用的函数:通过将回调函数的地址传给调用者从而实现调用.要实现回调,必须首先定义函数指针.尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似.请看下面的例子: void f():// 函数原型 上面的语句声明了一个函数

C/C++中函数指针的含义

函数存放在内存的代码区域内,它们同样有地址,我们如何能获得函数的地址呢? 如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 定义一个指向函数的指针用如下的形式,以上面的test()为例: int (*fp)(int a);//这里就定义了一个指向函数的指针 函数指针不能绝对不能指向不同类型,或者是带不同形参的函数,在定义函数指针的时候我们很容易犯如下的错误. int *fp(int a);//这里是错误的,因为按

C++指针探讨(三)成员函数指针

C语言的指针相当的灵活方便,但也相当容易出错.许多C语言初学者,甚至C语言老鸟都很容易栽倒在C语言的指针下.但不可否认的是,指针在C语言中的位置极其重要,也许可以偏激一点的来说:没有指针的C程序不是真正的C程序. 然而C++的指针却常常给我一种束手束脚的感觉.C++比C语言有更严格的静态类型,更加强调类型安全,强调编译时检查.因此,对于C语言中最容易错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,而且不能随便相互转换.而且这些指针的声明格式都不一样:

C++指针探讨(二)函数指针

在C/C++中,数据指针是最直接,也最常用的,因此,理解起来也比较容易.而函数指针,作为运行时动态调用(比如回调函数 CallBack Function)是一种常见的,而且是很好用的手段. 我们先简单的说一下函数指针.(这一部份没什么价值,纯是为了引出下一节的内容) 2 常规函数指针 void(*fp)(): fp 是一个典型的函数指针,用于指向无参数,无返回值的函数. void(*fp2)(int): fp2 也是一个函数指针,用于指向有一个整型参数,无返回值的函数. 当然,有经验人士一般都会

C++中的函数指针与函数对象的总结

以下是对C++中的函数指针与函数对象的使用进行了详细的分析介绍,需要的朋友可以参考下   篇一.函数指针函数指针:是指向函数的指针变量,在C编译时,每一个函数都有一个入口地址,那么这个指向这个函数的函数指针便指向这个地址. 函数指针的用途是很大的,主要有两个作用:用作调用函数和做函数的参数. 函数指针的声明方法:数据类型标志符 (指针变量名) (形参列表): 一般函数的声明为: int func ( int x );而一个函数指针的声明方法为:int (*func) (int x);前面的那个(