空指针与函数指针

指针作为参数传入函数的陷阱 下面以一个例子来引出这种错误:#include <iostream> using namespace std; #include <stdlib.h> #include <string.h> void func(int *p) { p = (int *)malloc(sizeof(int) * 10); memset(p, 0, sizeof(p)); p[0] = 1; } 阅读详情

空指针 void pointers

指针void 是一种特殊类型的指针。void 指针可以指向任意类型的数据,可以是整数,浮点数甚至字符串。唯一个限制是被指向的数值不可以被直接引用(不可以对它们使用引用星号*),因为它的长度是不定的,因此,必须使用类型转换操作或赋值操作来把void 指针指向一个具体的数据类型。

它的应用之一是被用来给函数传递通用参数

// integer increaser
#include <iostream.h>

void increase (void* data, int type) {
    switch (type) {
        case sizeof(char) : (*((char*)data))++; break;
        case sizeof(short): (*((short*)data))++; break;
        case sizeof(long) : (*((long*)data))++; break;
    }
}

int main () {
    char a = 5;
    short b = 9;
    long c = 12;
    increase (&a,sizeof(a));
    increase (&b,sizeof(b));
    increase (&c,sizeof(c));
    cout << (int) a << ", " << b << ", " << c;
    return 0;
}
  • 6, 10, 13

sizeof 是C++的一个操作符,用来返回其参数的长度字节数常量。例如,sizeof(char) 返回 1,因为 char 类型是1字节长数据类型。

函数指针 Pointers to functions

注:函数指针有两个用途:调用函数和做函数的参数。

注:函数名也是指向函数第一条指令的常量指针。

C++ 允许对指向函数的指针进行操作。它最大的作用是把一个函数作为参数传递给另外一个函数。声明一个函数指针像声明一个函数原型一样,除了函数的名字需要被括在括号内并在前面加星号asterisk (*)。例如:

// pointer to functions
#include <iostream.h>

int addition (int a, int b) {
    return (a+b);
}

int subtraction (int a, int b) {
    return (a-b);
}

int (*minus)(int, int) = subtraction;

int operation (int x, int y, int (*functocall)(int,int)) {
    int g;
    g = (*functocall)(x,y);
    return (g);
}

int main () {
    int m,n;
    m = operation (7, 5, addition);
    n = operation (20, m, minus);
    cout <<n;
    return 0;
}   
  • 8

在这个例子里, minus 是一个全局指针,指向一个有两个整型参数的函数,它被赋值指向函数subtraction,所有这些由一行代码实现:

int (* minus)(int, int) = subtraction;

这里似乎解释的不太清楚,有问题问为什么(int int)只有类型,没有参数,就再多说两句。

这里 int (*minus)(int int)实际是在定义一个指针变量,这个指针的名字叫做minus,这个指针的类型是指向一个函数,函数的类型是有两个整型参数并返回一个整型值。

整句话“int (*minus)(int,int) = subtraction;”是定义了这样一个指针并把函数subtraction的值赋给它,也就是说有了这个定义后minus就代表了函数subtraction。因此括号中的两个int int实际只是一种变量类型的声明,也就是说是一种形式参数而不是实际参数。

项目中用到了很多封装在struct中的函数指针,以前在MFC里面经常用到则个作为回调函数,还以为是微软设计的特色呢。在网上查了一下它的用法,做个总结。

1)提供调用的灵活性。设计好了一个函数框架,但是设计初期并不知道自己的函数会被如何使用。比如C的”stdlib”中声明的qsort函数,用来对数值进行排序。显然,顺序还是降序,元素谁大谁小这些问题,库程序员在编写qsort的时候不可能决定。这些问题是要在用户调用这个函数的时候才能够决定。那边qsort如何保证通用性和灵活性呢?采用的办法是让函数的使用者来制定排序规则。于是调用者应该自己设计comparator函数,传给qsort函数。这就在程序设计初期保证了灵活性。尽管使用函数指针使得程序有些难懂,但是这样的牺牲还是值得的。

2)提供封装性能。有点面向对象编程的特点。比如设计一个

typedef struct _c_stack{ 
    int base_size; 
    int point; 
    int * base; 
    int size; 
    int (*pop)(struct _c_stack *); 
    int (*push)(int,struct _c_stack *); 
    int (*get_top)(struct _c_stack); 
} c_stack;

化完之后,用户调用这个结构体上的pop函数,只需要s.pop(&s)即可。即使这个时候,工程内部有另外一个函数名字也叫pop,他们之间是不会发生名字上的冲突的。

原因很简单,因为结构体中的函数指针指向的函数名字可能是

int ugly_stupid_no_one_will_use_this_name_pop(c_stack *)

,只是stack的用户是不知道他在调用s.pop(&s),实际上起作用的是这样一个有着冗长名字的函数。
函数指针这种避免命名冲突上的额外好处对于一些库函数的编写者是很有意义的,因为库可能被很多的用户在许多不同的环境下使用,这样就能有效的避免冲突而保证库的可用性。

Halcon频域滤波实战:5分钟搞定傅里叶变换功率谱分析(附完整代码) 本文提供Halcon频域滤波的实战指南,重点讲解如何利用傅里叶变换功率谱分析快速解决图像处理难题。通过核心算子fft_image和power_real,演示了从间域转换到频域、分析功率谱以定位周期性噪声,并构造滤波器进行精准去除的完整流程,附有可直接运行的代码示例。 阅读详情

相关推荐

华为OD技术面真题 - Python开发 - 2

汇总华为OD技术面八股Python八股,高频技术真题并提供详细解答。

qq_45776114的博客 862

空指针、void指针函数指针

一、空指针是一种特殊的指针  一个指针变量指向空指针,表示该指针处于闲状态下,不指向任何地址 P=NULL;表示指针变量P指向空指针; 同时任何不用的指针都必须指向空指针,避免野指针的出现。 二、通用指针可以指向任何数据类型,也称void指针,可以把任何类型的指针变量赋给void指针; int *PA; void *PB; PB=(void*)PA; 同样,也可以把

chaoshui7758的博客 2445

早餐店点餐系统源码(java毕业设计框架springboot+mysql+vue完整源码+LW+说明文档).zip

早餐店点餐系统源码(java毕业设计框架springboot+mysql+vue完整源码+LW+说明文档)

C语言函数指针NULL

C语言中,函数指针和普通指针类似,如果定义了一个函数指针,比如int (*fun)(int a,int b); 那么函数指针fun将默认初始化为NULL。 注意: 1)函数指针不是函数声明,不要混淆。 2)C中函数名可以隐式转换为函数指针,但是C++中非静态成员函数无法隐式转换, 因此在C/C++中获取函数指针时最好统一用取地址符&:即函数指针 = &函数名。 ...

fish的专栏 3226

c语言中将函数指针作为形参_在C中将有效指针作为NULL指针

c语言中将函数指针作为形参Prerequisite: An Example of Null pointer in C 先决条件: C中的空指针示例 Any pointer that contains a valid memory address can be made as a NULL pointer by assigning 0. 通过分配0,可以将包含有效内存地址的任何指针设置为NU...

cumtb2002的博客 581

指针运算、空指针函数指针、staicconst的区别

1、父函数(main函数,主函数)调用子函数,子函数能修改父函数中的内容的前提是:(1)传指针;(2)解引用 题目:交换两个数据的值: void Swap1(int a,int b) //error 只交换了子函数中两个参数的值,当这样函数在主函数中调用时,并没有实现其交换功能(无传指针,也无解引用) { int tmp; tmp=a; a=b; b=tmp; } void Sw

flying_meteor的博客 390

《C指针漫谈:那个让你又爱又恨的家伙》(空指针、野指针、void 指针(万能指针)、函数指针指针数组、数组指针

本文主要讲解指针的多种用法,和一些概念,不过多赘述一些函数的用法,全文5400多字,根据需要查漏补缺, 如有疑问可以随时私信,会第一次时间进行更新补充和说明形而上学者谓之道,形而下学者谓之器目录前言一、指针的基本概念二、指针类型和指针运算三、多级指针四、万能指针五、野指针六、悬垂指针七、空指针八、指针和数组九、指针数组和数组指针十、指针和字符数组十一、指针和动态内存 堆和栈十二、动态内存函数 malloc calloc relloc 和free的使用十三、内存泄露十四、函数返回指针

qq_63561301的博客 826

C语言指针入门(解决你的各种概念问题的总结,包括空指针、野指针、数组指针指针数组、函数指针指针函数、多级指针等等)

本文记录了一些C指针的定义,包括空指针、野指针、数组指针指针数组、函数指针指针函数、多级指针等等一些知识点的小结。 1.空指针: 没有赋值的指针变量(没有指向内存变量的地址),对空指针操作会造成程序的Core dump(段错误) #include <stdio.h> #include <stdlib.h> int main() { int* p_i = 0; printf("p_i = %p \r\n", p_i); *p_i = 2;// 试图对空指针进行赋值操作,

qq_44078824的博客 315

C语言七:指针(声明、空指针指针运算、指针数组、指向指针指针、传递指针函数、从函数返回指针)、函数指针回调函数

C语言七:指针(声明、空指针指针运算、指针数组、指向指针指针、传递指针函数、从函数返回指针)、函数指针回调函数

weixin_54897533的博客 680

C语言指针(五)--函数指针

栈是一种先进后出的数据结构,

难波儿万的博客 822

C++学习day--18 空指针函数指针、引用

C++学习day--18 空指针函数指针、引用

我的博客 1036

函数指针指针函数

在内存中申请一片间0x7ffd1b14c0bc,用来存储变量a,里面的值为10,再把地址地址给pa,并返回pa,但在该函数运行结束之后,会释放栈区内所有变量,当运行到fun2时,又会重新把0x7ffd1b14c0bc用来存储变量b,里面的值为20,这就是悬控指针,应当避免,要在堆区进行申请间,malloc或new。悬空指针:当指针指向的对象被释放,但仍然指向已经被回收了的内存地址。悬空指针——在栈区申请间,被释放。野指针:未初始化的指针

weixin_50022690的博客 427

函数指针

    int *gun() ====>gun()  返回的是Int指针    int  (*gun) () ===> gun表示执行(*gun)()的函数指针    那么 int (*)() 就是类型gun的类型符号比如 我们可以这样    typedef  int (*funPtr)() ===>说明funPtr就是int型的函数指针    我们可以将0强制转换成一个Int类型的函数指针     (int(*)()) 0; 0代表的指针要注意2点: 1:它指向的内容不可访问 2:它不代表任何实际意义 比

AlexTiger0的专栏 698

C++ 函数指针的使用

函数指针就是指向函数指针变量,它存储的是函数在内存中的地址。就像普通指针指向变量一样,函数指针指向函数

weixin_73793168的博客 258

[c语言日寄]指针进阶:函数指针数组——转换表

在C语言的编程世界中,函数指针是一种非常强大且灵活的工具,它允许我们将函数像变量一样操作。而函数指针数组则进一步扩展了这种能力,可以将多个函数组织在一起,形成一个“转换表”,从而实现高效的函数调度和模块化设计。今天,我们就通过一个具体的案例来深入探讨函数指针数组的使用,以及它在C语言中的重要性和应用场景。函数指针数组是一个包含多个函数指针的数组。通过函数指针数组,我们可以将多个函数组织在一起,形成一个“转换表”。函数指针数组的定义方式如下:返回值类型 (*数组名[数组大小])(参数类型列表);

2401_83741734的博客 2282

【c语言】函数指针及其应用

在C语言中,函数指针是一种强大且常用的工具,它可以使我们的代码更加灵活和可扩展。本篇博客将深入探讨函数指针的概念、语法和常见应用场景,帮助读者更好地理解和运用函数指针

Colorful___的博客 424

C++----函数指针函数指针类型 返回值类型 (*类型名)(参数列表)

函数指针是C++中实现回调函数、动态分派等机制的核心特性。它本质是存储函数入口地址的指针变量,类型需函数签名完全匹配。基础用法包括声明、赋值和调用,其中类成员函数指针需特殊处理。函数指针常用于回调函数场景,作为参数或返回值传递。使用需注意空指针检查和类型匹配,尤其重载函数需显式转换。通过函数指针可实现灵活的运行时多态,是C++底层编程的重要工具。

MzKyle的博客 468

函数指针:C++中的“魔法指针”如何操控代码逻辑

语法规则:返回类型 (*指针名)(参数类型列表)例如,指向返回int且接受两个int。

2301_80758704的博客 492

函数指针小结

一直以来对函数指针指针函数都比较迷糊,在这里记录一下函数指针的具体使用。 错误代码(包括后面的代码,都只是部分代码,这里只探究内容): const Student* StudentMgr::query(const char* id) const { ///创建文件操作对象及解析 Student queryStudent={}; rapidxml::file<> fdoc(this->_fileName); rapidxml::xml_document

arible的博客 216
上一篇: C++输入输出
下一篇: Computer Network 1: Introduction
猴塞雷咩
博客等级 码龄11年 5粉丝 31原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值