`
waret
  • 浏览: 139693 次
  • 性别: Icon_minigender_1
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

typedef以及一些复杂表达式

 
阅读更多

1. typedef int (*PFV)();
    这是定义了一个函数指针,那么PFV p;就可以定义了一个指向函数的指针。

2. typedef int (*p[10])();
    这是把p定义为函数指针数组,那么 p array;语句就可以定义了一个函数指针数组,数组名即为array,array这个数组含10个元素。

3. typedef int (*parray)[3];
    这是定义了一个指向整型数组的指针,那么 parray ptr;就定义了一个指向数组的指针。如何对这个ptr赋值或者初始化呢?事实上,是通过二维数组名来对其进行赋值(初始化)的,因为二维数组名作为指针来讲,就是一个指向数组的指针,一次跨越一个数组。

4. typedef int a[3][3];
    这是把a定义为一个3*3的整型数组类型。当a b = {1}时就完成了一个3×3的整型数组的定义初始化的工作。同样,简单一点 typedef int a[3];这个语句是把a定义为一个一维数组类型。

5. typedef void func(int);
    这个语句定义了一个函数类型。通过这个typedef,我们可以比较清晰地定义出函数指针,func* p;即可。

6. typedef char* string; const string str;
    这里str是一个常量指针,而不是指针常量,即const修饰符针对的是指针,而不是char。

7. typedef int* int_pointer;
    定义一个指向整型的指针类型

8. int (*p)(const&, int);
    定义一个函数指针类型,p指向的函数必须返回int,形参必须是const&和int。

9. typedef int (*func_pointer)(const&, int);
    可以这样来理解:typedef int integer;将typedef去掉,那就是个变量的定义,这儿即定义了一个int型的变量integer,考虑这个integer是什么类型的,那么这个typedef语句就是将integer定义为这个类型的。将typedef int (*func_pointer)(const&, int);中的typedef去掉,就成了一个函数指针定义,即func_pointer被定义为函数指针类型变量,那么原来的typedef即将func_pointer定义为函数指针类型。

10. int (*testCases[10])();
    它定义了数组,testCases[10],数组中的元素是函数指针,函数指针的类型是 int (*)();
    怎么来理解这种定义呢?首先考虑数组的定义,数组的定义一般模式是:类型 数组名[大小]; 考虑这个表达式,似乎是定义了一个数组,但是数组名[大小]被夹在了中间,那么类型是什么呢,发现类型并不是简单的数据类型,而是一个函数指针型int (*p)(),这个函数没有参数,返回int型。从而这个表达式的含义是:定义了一个函数指针型的数组,大小是10。可以利用typedef来简化这种定义:typedef int (*PFV)(); PFV testCases[10];

11. int (*(*(*p())[])())[];
    首先,根据p()判断p是一个函数,再根据p()前面的*号判断该函数返回一个指针,下面就看这个指针指向的是什么类新了,我们可以把*p()替换成一 个*pointer,这个pointer就是函数p返回的指针,那么就成了int (*(*(*pointer)[])())[];再根据(*pointer)[],这说明了指针pointer是指向的一个数组,那么这个数组中的元素是 什么类型呢?由于数组名实际上就是个指针,我们把(*pointer)[](即(*p())[])替换成一个array,这样就成了 int (*(*array)())[];发现array是一个函数指针,从而数组中的每个元素是函数指针,而这个函数呢,又返回一个指针类型,把 (*array)()用func代替,就成了int (*func)[];这说明了func函数返回的是指向数组的指针,数组中的元素是int型。
这个表达式够酷!!!

12. p = (int( * (*)[20])[10])q;
    这是一个强制类型转换,q被强制类型转换成一个这样的指针类型,这个指针呢直线一个具有20个元素的数组,这个数组中的元素也是指针,是指向另外一种数组,这种数组是含有10个int型数据的一维数组。

13. int (*ptr)[3];
    这个表达式定义了一个数组指针(即指向数组的指针)ptr,ptr一次跨越一个由3个int型组成的一维数组。发现其定义的方式与函数指针定义的方式很相似,只是把()换作了[]。

    可见,分析复杂的表达式时(所谓复杂,即糅合了指针,数组,函数三样,缺少了一样就不会复杂了),从括号的最里层做起,最里层的东西是复杂表达式的“根节点”,然后一层一层脱,脱的时候,是这样的,比如里层是个数组,那么就是说这个数组的元素是什么呢,那就是外层的东西,如果里层是个有返回值的函数,那么就是说这个函数返回什么值呢?那就是外层的东西,就这样一层一层地把表达式解析清楚。

分享到:
评论

相关推荐

    复杂表达式计算器

    //把变换后的中缀表达式转换为变换后的后缀表达式 void compvalue();//计算表达式的值 void disp();//输出结果 void clear();//清空 void IsLegal();//初步判断表达式格式是否正确,并去掉空格,正确就返回true ...

    二叉树(C语言)以及构建表达式树

    二叉树是计算机科学中一种重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。...通过练习和理解表达式树,你将更好地掌握二叉树的基本概念,并能运用到更复杂的数据结构问题中。

    具有表达式的中缀表达式求值程序

    通过定义合适的数据结构和基本的栈操作,结合中缀转后缀表达式的转换算法以及后缀表达式的计算逻辑,我们可以高效准确地对任意复杂的中缀表达式进行求值。这种方法不仅在计算机科学中有广泛的应用,而且也是理解和...

    算术表达式与二叉树.docx

    - **测试数据**:输入各种类型的前缀表达式,包括纯数字、变量、复杂的组合表达式等。 - **运行过程测试**:确保每一步骤(读取、输出、赋值、求值)的正确性。 - **代码分析**:检查代码的逻辑、性能以及是否存在...

    利用堆栈实现逆波兰表达式 后缀法

    在计算机科学中,这种表达式被广泛用于编译器的设计、计算器程序以及各种解析表达式的算法中。 逆波兰表达式具有以下特点: 1. **无需括号**:由于运算符均置于操作数之后,因此无需使用括号来表示优先级。 2. **...

    c语言 typedef的用法详解

    ### C语言中的`typedef`详解 ...无论是定义简单的类型别名,还是复杂的复合类型,`typedef`都是C语言中不可或缺的一部分。正确使用`typedef`可以显著提高代码的质量和可读性,同时也有助于避免潜在的错误。

    算术表达式求值C代码实现

    通过这种方式,我们可以高效地解析和计算复杂的算术表达式,而无需依赖复杂的解析库。这对于学习算法、编译原理以及实现自己的小型计算器等项目非常有帮助。理解并实现这个过程对于提升编程技能和深入理解计算机内部...

    typedef的用法及与define的区别

    本篇文章将详细介绍`typedef`的四个主要用途,两个需要注意的陷阱,以及它与`#define`的区别。 **`typedef` 的四大用途** 1. **简化复杂类型名**:`typedef` 可用于为复杂的类型定义一个简短易记的名字。例如,当...

    C语言复杂表达式与指针应用视频精讲-C语言专题第4部分

    本课程是指针部分的话题,首先讲解了数组指针、指针数组、函数指针等常见的复杂指针表达式的分析方法、含义,再引入typedef关键字并详细讲解;后讲了二重指针、二维数组以及两者结合的运算。通过本章学习希望大家对...

    数据结构栈实现表达式求值

    例如:`3 + 4 * 2 / (1 - 5)^2^2` 是一个复杂的数学表达式。 ##### 2.2 运算优先级 在处理数学表达式时,不同的运算符具有不同的优先级。通常情况下,乘法和除法的优先级高于加法和减法;括号内的运算具有最高...

    #define和typedef的使用

    - 当需要进行类型检查或更复杂的类型定义时,应该使用 `typedef`。 通过以上的详细介绍,我们可以看出 `#define` 和 `typedef` 在 C 或 C++ 中各自发挥着重要的作用,根据具体的应用场景选择合适的工具可以使程序...

    Linux下的C语言正则表达式

    ### Linux下的C语言正则表达式使用详解 #### 引言 ...无论是简单的字符串匹配还是复杂的模式提取,正则表达式都能够提供强大的支持。希望本文能帮助读者更好地理解和使用C语言中的正则表达式功能。

    C语言数据结构中顺序栈的算法之求表达式的值

    在C语言中,数据结构是...对于C语言中的数据结构习题,掌握顺序栈的原理和操作,以及如何将其应用于表达式求值,对于提升编程能力非常有帮助。通过不断练习和理解,可以更好地掌握这些概念并在实际问题中灵活运用。

    数据结构 C语言版 表达式求值

    这种方式不仅能够高效地处理复杂的数学表达式,还能够根据实际需求进行灵活扩展。例如,可以通过增加更多类型的运算符或支持更复杂的数据类型来增强程序的功能。此外,这种方法还具有良好的可维护性和可扩展性,为...

    C表达式求值

    根据给定的信息,本文将详细解释“C表达式求值”的相关知识点,包括其背景、原理及具体的实现方法。...掌握了这些基础知识后,开发者可以更加灵活地处理各种复杂的数学表达式,并将其应用于实际项目中。

    表达式计算器 DLL

    使用这样的DLL,开发者可以轻松地在其应用程序中集成复杂的数学表达式计算功能,而无需自行实现整个解析和计算逻辑。这对于科学计算、工程应用或任何需要动态计算的场景都极具价值。然而,为了确保安全性和稳定性,...

    栈数据类型之表达式计算

    在传统的中缀表达式(如我们日常使用的算术表达式,例如2 + 3 * 4)中,运算符位于操作数之间,解析这样的表达式需要处理优先级和括号,这相对复杂。而栈可以简化这个过程,特别是在转换为后缀表达式后,计算变得...

    表达式求值

    在这个例子中,我们只处理了基本的四则运算,但你可以根据需要扩展它,增加对更多复杂表达式的支持,比如括号、函数调用等。 总的来说,表达式求值是编程语言解析和执行的基础,C语言因其灵活性和效率,常被用来...

    C语言typedef与复杂函数声明问题的深入解析

    答案与分析:对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句的开头就行了。 >1:int *(*a[5])(int, char*);//pFun是我们建的一个类型...

    define和typedef.md

    在C语言中,`typedef` 和 `define` 都被广泛用于简化代码的编写以及提高代码的可读性。然而,它们之间存在着本质的区别,在不同的场景下有着各自的优势和局限性。 ### 1. 原理不同 - **`typedef`**: 主要用于定义...

Global site tag (gtag.js) - Google Analytics