首页 > 其他分享 >C语言 - 万能指针

C语言 - 万能指针

时间:2023-10-10 11:33:58浏览次数:29  
标签:函数 万能 C语言 类型 函数指针 void 指针

1. 什么是万能指针?

万能指针其实就是void *类型的指针,而void *指针一般被称为通用指针或叫泛指针。它是C语言关于纯粹地址的一种约定。当某个指针是void型指针时,所指向的对象不属于任何类型。 因为void指针不属于任何类型,不可以对其进行算术运算,比如自增,编译器不知道其自增需要增加多少。

而对于char *型指针,自增一定是指针指向的地址加1,int*型指针自增,则偏移4。这个在指针的运算中p+n的解释中已经很详细的介绍过,这里不再累赘,有兴趣的可以自行查阅。

在C/C++中,在任意时刻都可以使用其它类型指针来代替void指针,或者用void指针来代替其他类型指针。 这样就可以衍生出很多比较有用的技巧。指针的本质,是其值为一个地址,那么延伸一下: 当使用关键字void声明指针变量时,它将成为通用指针变量。任何数据类型(char,int,float等)的任何变量的地址都可以赋值给void指针变量。这就是为什么把它称之为万能指针了。

1.1 万能指针使用规则

(1)使用前必须被初始化

(2)解引用过程必须强制转换

万能指针能被任何类型指针初始化,万能指针也和其他类型指针一样,可以当做函数参数,函数返回值,以及充当函数指针皆可。

 

1.2 万能指针操作基本数据类型

对指针变量的解引用,使用间接运算符*达到目的。但是在使用空指针的情况下,需要转换指针变量以解引用。这是因为空指针没有与之关联的数据类型。编译器无法知道void指针指向的数据类型。因此,要获取由void指针指向的数据,需要使用在void指针位置内保存的正确类型的数据进行类型转换。

1.3 万能指针充当函数返回值

万能指针充当函数返回值直接看下库中提供的动态内存申请函数即可,自己想要写的话稍微麻烦些,动态申请内存函数如下:

而我们在实用的时候为什么要强制转换就一目了然了。

1.4 万能指针充当函数参数

当我们想要设计一个可以传入任何类型的指针的函数的时候,我们就可以把参数设计为void *类型,而对于这类函数,内存的重新申请realloc函数其实也是void *的参数,很多操作内存的函数,参数设计其实都是void *类型的指针,如果你对于C语言掌握的可以,我相信下面两个函数你应该都了解过:

1.5 万能指针充当函数指针调用函数

虽说万能指针充当函数指针调用函数的方式真正自己开发的时候很少用,但是有幸我的学生面试的时候就遇到过这样的一道笔试题,所以在这里就给大家讲解下,如下代码,实现通过万能指针对函数的调用:

别人会问题 (*(void(*)())pVoid)()是做什么的? 初看,大家是不是满脑子黑人问号?其实结合上面的代码看,就知道其实就是一个无返回值无参函数通过万能指针调用而已。考究的无非以下C语言知识:

(1)函数指针调用函数: (*函数指针名)(参数表);

(2)强制转换语法:(目标类型)变量

(3)指针的类型: 去掉变量名剩下的就是指针的类型

而对函数print的函数指针是 :void (*p)() ,其实就是用(*p)替换函数名,就是该函数的函数指针,所以去掉变量名剩下的就是指针的类型,即:void (*)() ,然后pVoid 调用函数的方式: (*pVoid)(); 然后把类型拿过来强制转换即可得到:(*(void(*)())pVoid)(),明白了吧!就这么简单。

标签:函数,万能,C语言,类型,函数指针,void,指针
From: https://www.cnblogs.com/zhuchunlin/p/17754238.html

相关文章

  • 【C语言入门】第十天
    【例题1】1108.IP地址无效化-力扣(LeetCode)char*defangIPaddr(char*address){intlen=strlen(address);char*p=(char*)malloc(sizeof(char)*len+6+1);inti,j;for(i=0,j=0;i<len;i++){if(address[i]=='.'){j+......
  • Educational Codeforces Round 152 (Div. 2) D. Array Painting(双指针)
    EducationalCodeforcesRound152(Div.2)D.ArrayPainting//思路:双指针找连续正数段//若段中出现2,则更新两头的0的情况,若为涂色则改为true//若无2,则优先更新左侧0,若左0已经为true,则更新右侧0//数组开头结尾特判#defineintlonglong#defineldlongdoubleusingnam......
  • C语言没人教但必须了解的技巧
    前言工作了一年,对于代码的理解更进了一步,标准且好用的c代码能够使开发效率更上一层楼,这里整理了一下最近看到的一些c代码技巧,能使c代码编写更加标准化。参考文章地址:C语言中常用的宏定义(qq.com)C语言位操作符8个常用的小技巧(qq.com)宏定义类1.防止重复定义防止头文件......
  • C++移动和获取文件读写指针
    在读写文件时,有时希望直接跳到文件中的某处开始读写,这就需要先将文件的读写指针指向该处,然后再进行读写。ifstream类和fstream类有seekg成员函数,可以设置文件读指针的位置;ofstream类和fstream类有seekp成员函数,可以设置文件写指针的位置。所谓“位置”,就是指距离文件开头......
  • HarmonyOS/OpenHarmony原生应用-ArkTS万能卡片组件Stack
    堆叠容器,子组件按照顺序依次入栈,后一个子组件覆盖前一个子组件。该组件从APIVersion7开始支持。可以包含子组件。一、接口Stack(value?:{alignContent?:Alignment})从APIversion9开始,该接口支持在ArkTS卡片中使用。二、属性除支持通用属性外,还支持以下属性:三、示例//xxx.e......
  • C语言 - malloc与free函数
    C 内存管理本章将讲解C中的动态内存管理。C语言为内存的分配和管理提供了几个函数。这些函数可以在 <stdlib.h> 头文件中找到。在C语言中,内存是通过指针变量来管理的。指针是一个变量,它存储了一个内存地址,这个内存地址可以指向任何数据类型的变量,包括整数、浮点数、字......
  • 快慢指针用于数组的原地处理
    删除指定元素27.移除元素删除有序数组的重复项26.删除有序数组中的重复项删除有序数组重复项超过K次的部分80.删除有序数组中的重复项II整体来说,这类题目所用的方法都是快慢指针,只是其实现细节不尽相同而已。对我来说,做这种题目最好自己在纸上写写,不然很容......
  • 今天就差不多完成了ai编码c语言程序的过程
    不断改进的提示语:writeaprogramincandcompilebygcc,createasystemtrayicon,whentheiconisrightclicked,popupanexitmenutoexittheprogram,listeninbackgroup,whenkeycombinationCtrl+LeftArrowispressed,getcurrentactivewindowinwi......
  • C语言 模拟用户登陆场景只允许登录三次,错误三次后退出登录
    intmain(){inti=0;charpassword[20]={0};for(i=0;i<3;i++){printf("请输入密码:");scanf("%s",password);if(strcmp(password,"123")==0){printf("登陆成功\n");break;}else......
  • C语言使用%d读入字符会发生什么
    指定了%d来读取一个整数,scanf()函数开始每次读取一个输入字符,它跳过空白字符(包含空格、制表符和换行符)直到遇到一个非空白字符,并期望发现一个数字字符或者一个符号(+或者-)。如果发现一个数字或符号,那么就保存并读取下一个字符;如果接下来的字符是一个数字,再保存,继续读取。如此持......