[转载] 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语言指针的教程,旨在帮助初学者理解指针的基本概念及其在实际编程中的应用。教程通过一系列实例解释了指针的定义、工作原理以及如何...
1. **指针的类型**:指针的类型是指针变量自身的类型,决定于声明时的修饰符。例如: - `int*ptr;` 的指针类型为 `int*`。 - `char*ptr;` 的指针类型为 `char*`。 - `int**ptr;` 的指针类型为 `int**`。 - `int...
本文将深入探讨“C的一些整理”,重点围绕堆和栈的区别以及C语言中指针的奥秘和复杂应用展开。 首先,我们要了解的是堆和栈这两种内存区域的不同。栈内存,也称为自动存储区,主要用于存放程序运行过程中的局部变量...
C语言的编程基础涉及数据类型、控制结构、函数、指针等核心概念,而高级编程则涵盖更复杂的话题,如动态内存管理、文件操作、多线程和进程间通信。 内容部分由于OCR扫描结果存在文字识别错误和遗漏,导致部分信息...
7. 继承和多态:这是面向对象编程的核心概念之一,继承允许创建类的层次结构,多态则允许通过基类指针或引用来调用派生类的方法。 8. 异常处理:在Objective-C中,可以使用try-catch-finally结构来处理异常情况。 ...