`
atmosphere
  • 浏览: 14724 次
  • 性别: Icon_minigender_1
博客专栏
807a8b01-317a-34bf-9d0f-011a7c5a74b4
javase7官方教程翻译...
浏览量:11075
社区版块
存档分类
最新评论

复杂指针的声明(转载)

阅读更多

原文:http://www.ltesting.net/ceshi/ruanjianceshikaifajishu/rjcshjdj/unix/2007/0704/129082.html

 

参考了《C和指针》与《C程序设计语言》写成了下面的文档,主要是自己看着方便点:) 首先看几个简单的例子 int f; //一个整型变量 int *f; //一个指向整型的指针 不过,请看第 2 个声明是如何工作的:它把表达式 *f 声明为一个整数。根据这个事实,你肯定能clearcase/" target="_blank" >cc" size="4">      参考了《C和指针》与《C程序设计语言》写成了下面的文档,主要是自己看着方便点:)

      首先看几个简单的例子
      int f; //一个整型变量
      int *f; //一个指向整型的指针
      不过,请看第 2 个声明是如何工作的:它把表达式 *f 声明为一个整数。根据这个事实,你肯定能推断出 f 是个指向整型的指针。C 声明的这种解释方法可以通过下面的声明得到验证。
      int* f,g;
      它并没有声明两个指针。尽管它们之间存在空白,但星号是作用于 f 的,只有 f 是一个指针。 g 只是一个普通的整型变量。
   
      下面的例子,你曾见过:
      int f();
      它把 f 声明为一个函数,它的返回值是一个整数。旧式风格的声明对函数的参数不提供任何信息。它只声明了 f 的返回类型。现在我将使用这种旧式风格,这样例子看上去简单一些,后面我将再回到完整的原型形式。

      下面是一个例子:
      int *f();   // f 是一个函数,它返回一个指向 int 类型的指针
      要想推断出它的含义,必须确定表达式 *f() 是如何进行求值的。首先执行的是函数调用操作符(), 因为它的优先级高于间接访问操作符。
   
      接下来的一个声明更为有趣:
      int (*f)();   // f 是一个指向函数的指针,该函数返回一个 int 类型的对象
      确定括号的含义是分析这个声明的一个重要步骤。第 2 对儿括号是函数调用操作符,但第 1 对儿括号只是起到聚组的作用。它迫使间接访问在函数调用之前进行,使 f 成为一个函数指针,它所指向的函数返回一个整型值。
   
      “函数指针”? 是的,程序中每个函数都位于内存中的某个位置,所以存在指向那个位置的指针是完全可能的。
   
      现在下面的这个声明应该是比较容易懂了:


      int *(*f)();
      它和前一个声明基本相同, f 也是一个函数指针,它所指向的函数返回一个指向 int 类型的指针。必须对其进行间接访问操作才能得到一个整型值。
   
      现在让我们把数组也考虑进去。
      int f[];
      这个声明表示 f 是个整型数组,数组的长度暂时忽略,因为我们现在关心的是它的类型,而不是它的长度
           【注】如果它们的链接属性是external或者是作用函数的参数,即使它们声明时未注明长度,也仍然是合法的。
   
      下面的声明又如何呢?
      int *f[];
      这个声明又出现了两个操作符。下标的优先级更高,所以 f 是一个数组,它的元素类型是指向整型的指针
   
      下面的这个例子隐藏着一个圈套。不管怎样,让我们先推断它的含义。

      int f()[];
      f 是一个函数,返回一个整型数组。这里的圈套在于这个声明是非法的————函数只能返回标量值,不能返回数组。
   
      还有一个例子,颇费思量:
      int f[]();
      现在 f 似乎是一个数组,它的元素是返回值为整型的函数。但是,这个声明也是非法的,因为数组元素必须具有相同的长度,但不同的函数显然可能具有不同的长度。

      但是,下面的这个声明是合法的:
      int (*f[])();
      你必须找到所以的操作符,然后按照正确的次序执行它们。括号内的表达式 *f 首先进行求值,所以 f 是一个元素为某种类型的指针的数组。 表达式 () 是函数调用操作符,所以 f 肯定是一个数组,数组元素的类型是函数指针,它所指向的函数返回整型值。


      如果你弄明白了上面最后一个声明,下面这个应该是比较容易的了:
      int *(*f[])();
      它和上面那个声明的唯一区别就是多了一个间接访问操作符,所以这个声明创建了一个指针数组,指针指向返回整型指针的函数。


      新式风格的例子:
      int (*f)(int,float);
      int *(*g[])(int,float);
      前者把 f 声明为一个函数指针,它所指向的函数接受两个参数,分别是一个整型和浮点型,并返回一个整型。后者把 g 声明为一个指针数组,它所指向的函数接受两个参数,分别是整型和浮点型,并返回整型指针。

           【提示】如果你使用的是UNIX系统,并能访问Inte.net,你可以获得一个名叫 cdecl 的程序,它可以在 C 语言的声明和声明语义之间进行转换。它可以解释一个现存的 C 声明:
      cdecl> explain int (*(*f)())[10];
            declare f as pointer to function returning pointer to array 10 of int
      或者给你一个声明语义:
      cdecl> declare x as pointer to array 10 of pointer to function returning int
            int (*(*x)[10])()
      cdecl 的源代码可以从 comp.sources.unix.newsgroup 存档文件第 14 卷中获得。

 

分享到:
评论

相关推荐

    转载]如何理解c和c ++的复杂类型声明

    【理解C和C++的复杂类型声明】 在C和C++编程中,有时会遇到复杂的类型声明,这可能会让初学者感到困惑。本文旨在帮助理解这些复杂的声明,并提供解析它们的技巧。首先,我们从简单的类型声明开始。 1. 简单类型...

    指针 突破 (转载他人,是指针解说的精华)

    1. **指针的类型**:指针的类型是指针变量自身的类型,决定于声明时的修饰符。例如: - `int*ptr;` 的指针类型为 `int*`。 - `char*ptr;` 的指针类型为 `char*`。 - `int**ptr;` 的指针类型为 `int**`。 - `int...

    C的一些整理(转载free)

    例如,一个函数接受一个字符串数组作为参数,可以声明为`char **strs`,这表示strs是一个指针数组,每个元素都是一个字符指针。数组指针如`char (*arr)[10]`,则表示arr是一个指向包含10个字符的数组的指针。 此外...

    单片机以太网上网原代码(keil 工程,用RTS8019)--转载

    1)精简TCP/IP 协议栈,以减小代码量。ZLIP 目前没有支持UDP 协议,ICMP 协议 也只支持其中的echo 协议(响应ping 数据包)。...明确存储类型的指针,需要重入的函数已经声明为reentant,使用KeilC 的小 模式下编译。

    高质量C++编程指南(转载-中文).pdf

    - **继承与组合的选择**:根据实际需求,合理选用继承或组合,避免过度继承带来的复杂性和耦合度增加。 ### 其他编程经验 - **使用const**:合理使用const关键字,增强函数的健壮性和安全性。 - **性能优化**:在...

    C++技术

    C++的声明语法是其复杂性的体现之一,特别是指针、引用、模板等特性。这份文档可能通过实例和解释,帮助读者掌握如何正确理解和写出复杂的声明,这对于阅读和编写C++代码是必不可少的技能。 5. **VC++的链接错误...

    Linux内核加密框架设计与实现-书签版

    2. 加密框架设计复杂性:Linux加密框架的设计复杂,主要体现在其面向对象编程(OOP)的设计思路,以及高度的对象抽象与封装模型。这展示了作者在架构设计和面向对象抽象方面的能力。 3. IPsec协议对加密框架的应用:...

    Qt 快速入门实战资料

    19. 版权声明与转载说明:文档详细说明了教程的版权声明,包括原创性、转载时的注意事项和版权声明。 20. 读者交流与资料整理:文档提到了读者资料整理的目录,并鼓励学习交流和继续整理相关资料。 21. 文档修订...

    Qt教程及软件(超级浅显易懂_非常适合初学者)

    - **版权声明**:声明了该系列教程的原创性以及转载的规则和限制,保证了作者的权益。 ### 7. 其他资源与交流 - **读者资料整理目录**:提供了网友整理的资料下载和交流的平台。 - **在线教程和学习资源**:提供了...

    qt使用说明

    除了上述内容,教程还将提供一个版权声明,强调所有教程内容均为原创,并且可以自由转载,但需要保留版权声明,并且不能用于商业用途。这表明了教程作者对知识分享的开放态度和对版权保护的重视。 文档修订记录部分...

    Qt教程及软件超级浅显易懂_非常适合初学者.pdf

    本教程系列包括了从Qt Creator安装、编写第一个“Hello World”程序开始,到更高级的话题,如多窗口程序开发、菜单和图标添加、布局管理、文本编辑、事件处理、自定义鼠标指针、定时器和随机数生成。教程还覆盖了Qt...

    Qt4实用教程

    最后,文件还声明了原创内容的版权以及转载的注意事项,明确了作者对本站转载内容不承担责任的态度,体现了对知识产权的尊重。文档修订记录部分详细记录了教程的更新情况,显示了作者持续更新教程的承诺和努力。 总...

    潘多拉魔盒

    "hover"是CSS3选择器的一种,用于定义当鼠标指针悬停在元素上时的样式变化。在这个项目中,当鼠标浮动到"潘多拉魔盒"上时,小盒子会升起,这正是利用了hover伪类来触发特定的动画效果。通过设置不同的CSS属性,如`...

    4 Qt Creater系列教程.83

    您可以自由地进行非商业性质的转载,但在转载时必须保留原版权声明。我们也欢迎更多的有心人士参与到教程的整理和补充工作中来,共同完善这一宝贵资源。 #### 三、教程结构 本系列教程按照不同的主题和技术领域进行...

    Object-C 经典入门教程

    7. 继承和多态:这是面向对象编程的核心概念之一,继承允许创建类的层次结构,多态则允许通过基类指针或引用来调用派生类的方法。 8. 异常处理:在Objective-C中,可以使用try-catch-finally结构来处理异常情况。 ...

    GUIs_FEX.zip

    MATLAB GUI的41个实例帮助大家学习如何在没有GUIDE的情况下编写图形用户界面程序。41个实例主要涉及以下47个问题: 如何在uicontrol中操作字符串?...版权声明:本文为博主原创文章,转载请附上博文链接!

    浅析uCOS/II V2.85 内核工作原理

    ### 浅析μCOS/II V2.85 内核工作原理 #### 引言 μC/OS-II(Micro C/Operating ...- [2] http://gliethttp.cublog.cn [转载声明出处] 以上内容仅作为学习参考,更多深入细节还需结合官方文档和实践经验来探索。

    c99 学习笔记

    C语言的编程基础涉及数据类型、控制结构、函数、指针等核心概念,而高级编程则涵盖更复杂的话题,如动态内存管理、文件操作、多线程和进程间通信。 内容部分由于OCR扫描结果存在文字识别错误和遗漏,导致部分信息...

Global site tag (gtag.js) - Google Analytics