C语言之声明的语法

概述

在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题。

问题:声明与函数

有一段程序存储在起始地址为0的一段内存上,如果我们想要调用这段程序,请问该如何去做?

答案

答案是(*(void (*)( ) )0)( )。看起来确实令人头大,那好,让我们知难而上,从两个不同的途径来详细分析这个问题。

答案分析:从尾到头

首先,最基本的函数声明:void function (paramList);

最基本的函数调用:function(paramList);

鉴于问题中的函数没有参数,函数调用可简化为 function();

其次,根据问题描述,可以知道0是这个函数的入口地址,也就是说,0是一个函数的指针。使用函数指针的函数声明形式是:void (*pFunction)(),相应的调用形式是: (*pFunction)(),则问题中的函数调用可以写作:(*0)( )。

第三,大家知道,函数指针变量不能是一个常数,因此上式中的0必须要被转化为函数指针。

我们先来研究一下,对于使用函数指针的函数:比如void (*pFunction)( ),函数指针变量的原型是什么? 这个问题很简单,pFunction函数指针原型是( void (*)( ) ),即去掉变量名,清晰起见,整个加上()号。

所以将0强制转换为一个返回值为void,参数为空的函数指针如下:( void (*)( ) )。

OK,结合2)和3)的分析,结果出来了,那就是:(*(void (*)( ) )0)( ) 。

答案分析:从头到尾理解答案

(void (*)( )) ,是一个返回值为void,参数为空的函数指针原型。
  (void (*)( ))0,把0转变成一个返回值为void,参数为空的函数指针,指针指向的地址为0.
  *(void (*)( ))0,前面加上*表示整个是一个返回值为void的函数的名字
  (*(void (*)( ))0)( ),这当然就是一个函数了。

我们可以使用typedef清晰声明如下:

typedef void (*pFun)( );

这样函数变为 (*(pFun)0 )( );

时间: 2024-11-01 00:25:39

C语言之声明的语法的相关文章

c语言基础-C语言基础中的语法问题

问题描述 C语言基础中的语法问题 下面是我写的代码,是一个加密的过程,运行了几遍都有语法错误,请高手在空闲之余能帮我看下是哪里错了,万分感谢 #include<stdio.h>#include<string.h>void main(){void m(*int); char a[50]*p; int l; scanf(""%s""a); l=strlen(a); p=a; m(pl); printf(""%s"&q

快看Sample代码,速学Swift语言(1)-语法速览

Swift是苹果推出的一个比较新的语言,它除了借鉴语言如C#.Java等内容外,好像还采用了很多JavaScript脚本里面的一些脚本语法,用起来感觉非常棒,作为一个使用C#多年的技术控,对这种比较超前的语言非常感兴趣,之前也在学习ES6语法的时候学习了阮一峰的<ECMAScript 6 入门>,对JavaScript脚本的ES6语法写法叹为观止,这种Swift语言也具有很多这种脚本语法的特点,可以说这个Swift在吸收了Object C的优点并摒弃一些不好的东西外,同时吸收了大量新一代语言的

struct-C语言typedef声明问题

问题描述 C语言typedef声明问题 请问为什么第一种声明编译是通不过错的,第二种是正确的.第一种:typedef Node *List;//两者仅第一句不同typedef struct LNode { int Data[40]; struct LNode * Last;} Node ;第二种:typedef struct LNode *List;typedef struct LNode { int Data[40]; struct LNode * Last;} Node ; 解决方案 typ

c语言-这个C语言函数声明意思?

问题描述 这个C语言函数声明意思? 编写一个函数,该函数将一个unsignedint中的所有位向左旋转指定数量的位.例如,rotate_l(x,4)将x中的所有位向左移动4个位置,而且从左端丢失的位会重新出现在右端.也就是说,把从高位移出的位放入低位.在程序中测试该函数. int rotate_l(unsigned int number, unsigned int bit) { unsigned int i; unsigned int hign = 8 * sizeof(unsigned int

python学习笔记:语言、调试、语法、变量、表达式

python是编程语言的一种,有着传统编程语言的强大性和通用性,同时也借鉴了简单脚本和解释语言的易用性.总结一句话来概括就是:很好很强大! 1.编程语言就是编写程序的语言,而程序是根据语言提供的指令,按照一定的逻辑顺序,对获得的数据进行运算,并将结果最终返回给我们的指令和数据的组合.语言分为两种: 低级语言:用英文单词或单词的缩写代表计算机执行的指令,使编程的效率和程序的可读性都有了较大的提高.    高级语言:是人类逻辑思维的程序化.数字化和精确化数学描述,翻译成机器代码有两种方法,解释和编译

C语言中声明和定义详解

变量声明和变量定义 变量定义:用于为变量分配存储空间,还可为变量指定初始值.程序中,变量有且仅有一个定义. 变量声明:用于向程序表明变量的类型和名字. 定义也是声明,extern声明不是定义 定义也是声明:当定义变量时我们声明了它的类型和名字. extern声明不是定义:通过使用extern关键字声明变量名而不定义它. [注意] 变量在使用前就要被定义或者声明. 在一个程序中,变量只能定义一次,却可以声明多次. 定义分配存储空间,而声明不会. C++程序通常由许多文件组成,为了让多个文件访问相同

语言变量声明内存分配

一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)- 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结构中的栈.程序结束时由编译器自动释放. 2.堆区(heap) - 在内存开辟另一块存储区域.一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 .注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵. 3.全局区(静态区)(static)-编译器编译时即分配内存.全局变量和静态变量的存储是放在一块的,初始化的全局

Delphi语言学习2-基本语法

1.基本赋值语句 Size :=20; Price :=10; 2.特殊符号 1)单个特殊符号 # $ & ' ( ) * + , - . / : ; < = > @ [ ] ^ { } 2)成对的特殊符号 (* (. *) .) .. // := <= >= <> 3).等价的特殊符号 特殊符号 等价的特殊符号 [ (. ] .) { (* } *) 3.注释和编译器指令 1)注释 { Text between a left brace and a right

as 3.0变量声明与语法

好了下面我们接着来看看as 3.0 里面的变量申明与语法吧,as 3.0 与c  有一点像了,与php也有一点像了,下面我们就来看看AS 3.0 有那些常用的数据类型吧.Boolean,int Number ,String 与uint这是常用的,下面列出一些复杂的类型吧.Array,Date,Error,Function,RegExp,XMLList等了. 下面我们来看一个简单的例子吧. 申明数据类型为:var 变量名:数据类型;第二种:var 变量名:数据类型=值; 下面我们看个:   i;