`
killvin
  • 浏览: 46243 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

[转载] C语言复杂指针的声明

 
阅读更多

 

 

[转载] http://hi.baidu.com/%B6%E0ά%CA%FD%D7%E9/blog/item/ffb08cd434073a03a18bb786.html

 

考了《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系统,并能访问Internet,你可以获得一个名叫 cdecl 的程序,它可以在 C 语言的声明和声明语义之间进行转换。

分享到:
评论

相关推荐

    很好的C语言复杂指针分析

    本文将深入探讨“复杂指针”的概念,以及如何使用“右左法则”来解析和理解复杂的指针声明。 复杂指针声明通常涉及指针、数组和函数的嵌套组合,它们的解析需要遵循一定的规则。右左法则是一种流行的方法,用于理解...

    c语言指针c语言指针c语言指针c语言指针c语言指针

    c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...

    C语言指针详解.zip

    c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 ...

    C语言所有复杂的指针声明

    C语言中的指针声明可以变得相当复杂,尤其是在涉及到多层嵌套、指针与数组、函数结合时。右左法则是一种解析这些复杂声明的有效方法,虽然它不是C语言标准的一部分,但广泛被C程序员用来理解声明的含义。下面我们将...

    C语言右左法则----复杂指针解析

    C语言右左法则----复杂指针解析 C语言中的指针声明可以非常复杂,以至于让人难以理解和解析。为了解决这个问题,右左法则被引入,以帮助开发者更好地理解和解析复杂的指针声明。右左法则是一个简单却非常实用的方法...

    C语言用指针将字符串数组位置颠倒

    C语言用指针将字符串数组位置颠倒,实现ABCDEFGHIJKLMNOPQRSTUVWXYZ转换成ZYXWVUTSRQPONNOPQRSTUVWXYZ

    C语言-指针.pdf

    在C语言的学习过程中,指针是一个非常重要且复杂的话题,它允许程序直接访问内存地址,进行更为底层和高效的内存管理。本文将详细介绍C语言中指针的概念、使用方法,以及如何快速掌握这一重要知识点。 首先,我们...

    C语言指针练习填空和阅读程序题

    在C语言中,指针可以声明为一个指针变量,例如:`int *p;`,其中`p`是一个指向整型变量的指针。 二、指针运算 指针运算是指针的一种操作,包括指针的加法、减法、乘法、除法等。例如,`*p`表示指针`p`所指向的变量...

    C语言指针学习笔记

    如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来...

    C语言中的指针学习 C语言中的指针学习

    在C语言中,指针是理解程序运行机制和优化代码的关键概念之一。通过掌握指针,程序员能够更灵活地操作内存、实现复杂的数据结构,并提高程序的效率。下面,我们将深入探讨C语言中的指针概念及其应用。 ### 基础指针...

    超强的指针学习笔记 C语言所有复杂的指针声明,都是由各种声明嵌套构成的。如何解读复杂指针声明呢?右左法则是一个既著名又常用的方法。

    右左法则是一种解析C语言中复杂指针声明的方法,它不是C语言标准的一部分,而是根据标准中的声明规则归纳出来的。该法则的英文原文是:“The right-left rule: Start reading the declaration from the innermost ...

    C语言复杂声明xiaoyi

    C语言的声明确实有可能变得非常复杂,特别是在处理指针、数组和函数的组合时。理解这些复杂的声明对于编写和理解C程序至关重要,因为它们能够精确地描述变量的类型和结构。下面我们将详细探讨如何解析和理解C语言的...

    c语言利用指针求数组的最大值与最小值

    c语言利用指针求数组的最大值与最小值,下载资源,数组可扩展。

    明解c语言,指针,各种操作,

    6. **指针的指针**:二级指针或者多级指针可以用来指向指针变量,这种复杂的数据结构在处理多维数组和复杂的结构体时非常有用。书中会探讨如何声明和使用指针的指针。 7. **指针陷阱与安全**:指针未初始化、空指针...

    彻底搞定C语言指针————

    在C语言的世界中,指针是一个核心概念,对于初学者来说,它的概念让人既兴奋又迷惑。然而,要想成为C语言编程的高手,掌握指针的用法是绕不开的必经之路。在本文中,我们将详细地探讨C语言指针的用法,帮助读者彻底...

    C语言指针函数和函数指针详细介绍.

    C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...

    C语言中指针、数组和函数的综合应用与实例解析.pdf

    C语言中指针、数组和函数的综合应用与实例解析 本文对C语言中指针、数组和函数的概念、运算和应用进行了详细的探讨和分析。指针是C语言的重要特色,是一种特殊的数据类型,通过存储空间的地址或编号来访问数据。...

    c语言指针学习笔记

    4. 指针的使用能够提高程序的运行效率,但也增加了程序出错的复杂性。 5. 对于新手而言,理解和掌握指针是一个逐步深入的过程,建议通过大量的练习来熟悉指针的使用和管理。 本文档为C语言指针的学习笔记,从基础到...

    C语言指针总结

    虽然指针的使用具有一定的难度和复杂性,但是只要我们遵循正确的声明规则,理解指针类型和指针所指向类型的差异,掌握指针的基本操作,并注意使用指针时的安全性问题,我们就能充分利用指针的强大功能,编写出更加...

    c语言课件指针

    ### C语言中的指针知识点详解 #### 一、引言 C语言作为一种高效且功能强大的编程语言,在系统级编程和底层开发中具有不可替代的地位。其中,“指针”是C语言的一个核心概念,掌握好指针对于深入理解和高效利用...

Global site tag (gtag.js) - Google Analytics