Void and function pointers. Hash tables.
Void pointers
• C does not allow us to declare and use void variables.
• void can be used only as return type or parameter of afunction.
• C allows void pointers
• Question: What are some scenarios where you want to pass voidpointers?
• void pointers can be used to point to any data type
• int x; void∗ p=&x;/∗points to int ∗/
• float f ;void∗ p=&f;/∗points to float ∗/
• void pointers cannot be dereferenced. The pointers shouldalways be cast before dereferencing.
void∗ p; printf ("%d",∗p);/∗ invalid ∗/
void∗ p; int ∗px=(int∗)p; printf ("%d",∗px); /∗valid ∗/
C中的void像数学中的“0”一样,看似很简单,但其出现具有重大意义。变量之所以不能声明为void,我认为是因为变量一声明就在内存中分配空间了,既然分配了空间,那么就不能叫void了。但变量有时候需要表示空,这时只好用NULL来表示,NULL是宏,其数值一般是0。
无论什么类型的指针,其都具有一个“父类型”,指针。因此void指针也是指针,指向的数据类型为“空”而已。“万物皆空”,因此任何类型的指针都可以指向空。没用具体的类型,只知道起始位置,所占内存的长度无法得知,因此也无法正确地获取数据。若要获取数据,只好再赋类型给void指针。
Function pointers
• In some programming languages, functions are first classvariables (can be passed to functions, returned from functions etc.).
• In C, function itself is not a variable. But it is possible todeclare pointer to functions.
• Question: What are some scenarios where you want to passpointers to functions?
• Declaration examples:
• int (∗fp )( int ) /∗notice the () ∗/
• int (∗fp )( void∗,void∗)
• Function pointers can be assigned, pass to and from functions,placed in arrays etc.
• Can assign to a function pointer:
int (∗fp )( void ∗, void ∗) = strcmp_wrapper; or
int (∗fp )( void ∗, void ∗) = &strcmp_wrapper;
• Can call from function pointer: (str1 and str2 arestrings)
int ret = fp( str1 , str2 ); or
int ret = (∗fp )( str1 , str2 );
函数不能“变化”,即不能像变量一样被赋值。这也挺好理解,函数的作用就是复用一组操作,从而减轻程序员的工作量和减小程序体积,防止“重复发明轮子”。但这样就不能像变量一样“变化”,即程序里使用某个方法后,不能动态地用赋值方式改变。虽然不能将方法代码直接赋值,但我们可以获取它的指针,通过指针来调用方法。无论什么样的指针,其总是一个“指针”,即可以在内存中随意保存指针,并且不会对程序体积有较大影响且不影响方法的复用。
从方法指针也可以看出,方法这种“类型”由哪些要素决定。至少包括返回类型和参数类型。
使用函数指针是因为要灵活性,即不确定用哪个方法,因此在框架中和类库中应该有大量的应用。
Callbacks
Definition: Callback is a piece of executable code passed tofunctions. In C, callbacks are implemented by passing functionpointers.
Example:
void qsort(void∗ arr , int num,int size ,int (∗fp )( void∗pa,void∗pb))
• qsort() function from the standard library can be sort anarray of any datatype.
• Question: How does it do that? callbacks.
• qsort() calls a function whenever a comparison needs to bedone.
• The function takes two arguments and returns (<0,0,>0)depending on the relative order of the two items.
回调函数是传给方法的一组可执行代码,即是一个指令流和数据流而不仅仅是数据。在函数式编程语言中,遍布回调函数,因为其运行机制就是不断地解函数,并且里面的函数是可以像变量一样赋值。
Hash table
Hash tables (hashmaps) combine linked list and arrays to providean efficient data structure for storing dynamic data. Hash tablesare commonly implemented as an array of linked lists (hash tableswith chaining).
哈希表将一个稀疏的数据分布映射到一个较为密集的分布,并且通过映射函数达到或接近随机存储的速度。hash的效率取决于映射函数。
分享到:
相关推荐
资料目录.bat Advice to next year student.doc lec1.ppt lec10.ppt lec11.ppt lec12.ppt lec13.ppt lec14.ppt lec15.ppt lec16.ppt lec17.ppt lec18.ppt lec19.ppt ...lec6.ppt lec7.ppt lec8.ppt lec9.ppt
In the previous lecture, we leant about impedance spectroscopy. Electrochemical impedance spectroscopy is the technique where the cell or electrode impedance is platted versus frequency. Thus, the ...
programming in computing 10a lec2
EI374 高级算法-全套 PPT 课件-笔记 lec1-slides.pdf lec1.pdf lec2-slides.pdf lec2.pdf lec3-slides.pdf lec3.pdf lec4-slides.pdf ...lec6.pdf lec7.pdf lec8.pdf lec9.pdf lec10.pdf lec11.pdf
6. **划分风险等级**:根据LEC分值将危险源分为不同的风险等级,如低风险、中风险和高风险。 总的来说,"lec.rar_LEC"提供的工具是进行LEC风险评估的重要助手,它使用MATLAB语言编写,能够客观地计算和分析工作场所...
Lec 00 Introduction and Course Overview Lec 01 Bezier Curves and Splines Assignment 0 Lec 02 Curves Properties and Conversion, Surface Representation Lec 03 Coordinates and Transformations Lec 04 ...
EI338 计算机系统工程-Computer Systems Engineering-全套 PPT 课件 CA-lec1.pdf ...lec6-OS.pdf lec7-OS.pdf lec8-OS.pdf lec9-OS.pdf lec10-OS.pdf lec11-OS.pdf lec12-OS.pdf Study-Guide.pdf Summary.pdf
《LEC培训(完整版).pdf》是一份关于逻辑等效检查的详细教程,重点介绍了使用Conformal工具进行逻辑等效验证的方法和技术。Conformal是一款强大的逻辑等效检查工具,广泛应用于芯片设计的验证阶段,确保设计的逻辑...
在Linux系统中,头文件是C语言编程的关键部分,它们允许程序员在源代码(如lec.c)中使用特定的函数和数据类型,而无需在每个文件中包含完整的实现。lec.c很可能是这个LAN Emulation客户端的实现文件,包含实际的...
麻省理工matlab课件-MIT6_094IAP10_lec04.pdf 本帖最后由 sunchy11 于 2012-2-8 15:46 编辑 分享个MIT的matlab 教程,属于初级入门,希望对大家有帮助哈。
由于提供的文件内容主要是一些网站链接、电子邮箱地址和数字的排列,没有提供实际的HOLLiAS-LEC G3 PLC选型手册的详细内容,我无法直接从中提取相关的知识点。然而,我可以根据HOLLiAS-LEC G3 PLC这个主题,根据一般...
LEC-3210AU8F4型号除了具备6个千兆LAN端口和10个隔离串口外,还提供4个百兆多模光纤接口;LEC-3210AU8B型号和LEC-3210AU8C2型号分别提供1路IRIG-B码对时和2路CAN接口。 LEC-3210在电力自动化系统中具有重要的应用...
Week1—4_Note_Lec1—6.pdf
总结而言,“lec.zip_LEC _点名_点名系统_点名系统C_随机点名”提供的是一款基于C语言实现的随机点名系统,它集成了随机数生成和数据管理技术,为教学环境带来了便捷和公平。通过理解和掌握这样的系统,不仅可以提升...
demo_Lec.m
"Lec 1 SDLC.pptx"这个文件很可能包含了对SDLC和UML的详细介绍,涵盖了以上各个阶段的理论知识和实际应用案例。通过学习这个讲座材料,可以深入理解这两个概念如何在实际项目中协同工作,提升软件开发的效率和质量。...
麻省理工matlab课件-MIT6_094IAP10_lec05.pdf 本帖最后由 sunchy11 于 2012-2-8 15:46 编辑 分享个MIT的matlab 教程,属于初级入门,希望对大家有帮助哈。
Lec1-Introduction.pdf.zip
安全风险源识别LEC评分.pdf
立华公司推出的LEC-3010 Din-Rail嵌入式通讯管理机是一款基于Intel Atom N450处理器的高性能通讯控制设备,其设计注重低功耗、嵌入式应用,具备多种硬件接口,满足工业现场对通讯和控制的严格需求。 LEC-3010主要...