`
cuishuangjia
  • 浏览: 156115 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

typedef 与指针

阅读更多
typedef 与指针zz
---------------------------------------------
指向数组的指针(叫做数组指针)
指向函数的指针,即函数指针
int *f(int ),f 函数,返回int 型的指针
int (*f)(),f 是指向int(int)的指针,f 是一个函数指针变量
:函数名是一个地址。
一个函数在编译时被分配一个入口地址,将这个入口地址称为函数的指针,可
---------------------------------------------------------------------
-----
typedef 似乎很简单,如typedef int integer;然而,这些简单的typedef 语
句容易让人产生一种误解,typedef 就是一种宏替换,把后面的自定义类型替换
成前面的已知类型,事实是这样的吗?显然不是!
考虑这样的问题:如何定义一个指向整型的指针类型?如何定义一个函数指
针类型?
第一个问题很简单:typedef int* int_pointer;即可,对于第二个问题,似
乎就没有那么简单了,首先,看函数指针的定义方法:int (*p)(const&, int);
这个p 指向的函数必须返回int,形参必须是const&和int。现在要将这种指针
类型命名为func_pointer,其定义的方法如下:
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 定义为函数指针类型。
----
typedef int (*func_pointer)(const&, int);
typedef 是一种存储类型的声明。
函数指针类型,是一种类型,int (*)(const&, int);就是函数指针类型,
func_pointer 是函数指针类型的变量,是一个变量的名字。
------
int (*testCases[10])();
这个表达式是什么意思?-------------函数指针数组
----
函数指针类型。int(*)()
变量名是testCases【10】,是一个函数指针类型的变量,----函数指针类型的
数组
指数组testCase,大小是10,其各个元素都是函数指针类型的。
等价于:
typedef 来简化这种定义:
typedef int (*PFV)();
PFV testCases[10];
===
数组指针(即指向数组的指针)的定义: int (*ptr)[3];
这个表达式定义了一个数组指针ptr,ptr 一次跨越一个由3 个int 型组成
的一维数组。发现其定义的方式与函数指针定义的方式很相似,只是把()换作
了[]。
-----
----
指针,数组,函数糅合在了一起问题变得复杂起来。它定义了数组,
testCases[10],数组中的元素是函数指针,函数指针的类型是int (*)();
怎么来理解这种定义呢?首先考虑数组的定义,数组的定义一般模式是:类
型数组名[大小];
考虑这个表达式,似乎是定义了一个数组,但是数组名[大小]被夹在了中间,那
么类型是什么呢,发现类型并不是简单的数据类型,而是一个函数指针类型int
(*p)(),这个函数没有参数,返回int 型。从而这个表达式的含义是:定义了一
个函数指针型的数组,大小是10。可以利用typedef 来简化这种定义:
typedef int (*PFV)();
PFV testCases[10];
其实int (*testCases[10])();这儿我们定义了一个函数指针数组,数组是主体。
下面考虑这样的问题:如何定义一个指向数组的指针(叫做数组指针)?
指向数组的指针,好像比较新鲜,所谓指向数组的指针,即指针的一步跨越
是一个数组,跟指向整型的指针一步跨越一个整型一个道理。事实上前面已经碰
到了指向数组的指针,如二维数组名,实际上就是一个指向数组的指针,它一次
跨越一行的数据,实际上即是跨越了一个一维数组,而三维数组名呢,也是一个
指向数组的指针,它一次跨越的是低维组成的一个二维数组。
数组指针(即指向数组的指针)的定义: int (*ptr)[3];
这个表达式定义了一个数组指针ptr,ptr 一次跨越一个由3 个int 型组成
的一维数组。发现其定义的方式与函数指针定义的方式很相似,只是把()换作
了[]。更进一步,如果要定义一个指向数组的指针,而数组中的元素不是简单的
int 型,而是比较复杂的类型,那该如何定义呢?事实上数组指针这种东西就已
经够稀有的了,一般编程绝对不会用到,我们只需要能读懂一些比较复杂的东西
就行了,自己没有必要构造这么复杂的类型。
比较复杂的表达式:
1、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 型。
这个表达式够酷!!!
2、p = (int( * (*)[20])[10])q;
这是一个强制类型转换,q 被强制类型转换成一个这样的指针类型,这个指
针呢直线一个具有20 个元素的数组,这个数组中的元素也是指针,是指向另外
一种数组,这种数组是含有10 个int 型数据的一维数组。
可见,分析复杂的表达式时(所谓复杂,即糅合了指针,数组,函数三样,
缺少了一样就不会复杂了),从括号的最里层做起,最里层的东西是复杂表达式
的“根节点”,然后一层一层脱,脱的时候,是这样的,比如里层是个数组,那
么就是说这个数组的元素是什么呢,那就是外层的东西,如果里层是个有返回值
的函数,那么就是说这个函数返回什么值呢?那就是外层的东西,就这样一层一
层地把表达式解析清楚。
关于typedef 还有一些要说的:
typedef int (*PFV)(); 这是定义了一个函数指针,那么PFV p;就可以定义了
一个指向函数的指针。
typedef int (*p[10])(); 这是把p 定义为函数指针数组,那么p array;语句
就可以定义了一个函数指针数组,数组名即为array,array 这个数组含10 个元
素。
typedef int (*parray)[3];这是定义了一个指向整型数组的指针,那么parray
ptr;就定义了一个指向数组的指针。如何对这个ptr 赋值或者初始化呢?事实
上,是通过二维数组名来对其进行赋值(初始化)的,因为二维数组名作为指针
来讲,就是一个指向数组的指针,一次跨越一个数组。
typedef int a[3][3]; 这个语句什么意思呢?这是把a 定义为一个3*3 的整型
数组类型。当a b = {1}时就完成了一个3×3 的整型数组的定义初始化的工作。
同样,简单一点typedef int a[3];这个语句是把a 定义为一个一维数组类型。
typedef void func(int); 这个语句定义了一个函数类型。通过这个typedef,
我们可以比较清晰地定义出函数指针,func* p;即可。(p 是void(int)类
型指针)
typedef char* string;
const string str;
这个str 是什么类型的呢?const char * str,即指向常量的指针类型?事实上,
答案有些不可思议,str 是一个常量指针,而不是指针常量,即const 修饰符针
对的是指针(就是str,string 是一个指针类型,指向char 类型变量),而不
是char。
以用一个指针变量指向该函数指针,然后通过该变量来调用函数。
分享到:
评论

相关推荐

    理解复杂的CC++声明 const, typedef , 函数指针

    理解复杂的C/C++声明 const, typedef, 函数指针 在C/C++编程中,声明是一种定义变量、函数、数组、指针等的方式。 declares 是一种基本的语法结构,用于定义变量、函数、数组、指针等。在本文中,我们将详细介绍...

    typedef_函数指针.wps

    于C++中函数指针的使用(包含对typedef用法的讨论)

    c++typedef函数指针类型[文].pdf

    C++ typedef 函数指针类型详解 C++ 中的函数指针是一种特殊的指针类型,它可以指向一个函数的入口地址,然后通过该指针变量来调用函数。函数指针的声明格式为:函数返回值类型(*指针变量名)(参数类型列表)或者...

    typedef的应用

    #### 三、Typedef与指针 `typedef`也可以用于简化指针类型的声明。例如,定义一个指向字符的指针类型: ```c++ typedef char *pstr; int mystrcmp(pstr, pstr); ``` 这里通过`typedef`定义了一个新的类型`pstr`,...

    Keil C51中函数指针的使用

    其次,无参数的函数指针的使用方法与ANSI C基本相同。例如: ```c void foo(void) { return; } int main(void) { void (*pf) (void) = foo; (*pf) (); return 0; } ``` 最后,带参数的函数指针一般来说,函数...

    typedef与define的区别

    typedef与define的区别 在C/C++语言中,typedef和define是两个常用的关键字,虽然它们都可以用来定义别名,但是它们的用法和特点却有很大的区别。 一、typedef的用法 typedef是C/C++语言中的一个关键字,用于定义...

    UndSt the Pointer In-depth

    5. 指针与数组的关系: 指针和数组在某些方面密切相关,因为数组名在大多数情况下可以被视为指向数组首元素的指针。但数组不是指针,它们是固定大小的数据结构,而指针是变量,可以改变其存储的地址。 6. typedef...

    408结构体对齐-typedef-结构体指针-c++引用

    ### 结构体对齐、typedef、结构体指针与C++引用详解 #### 一、结构体对齐 **结构体对齐**是指在结构体中的成员变量在内存中的排列方式,这种排列是为了提高CPU访问内存的速度。由于现代处理器的设计倾向于以一定的...

    关于C++中函数指针的使用(包含对typedef的分析).txt

    ### 关于C++中函数指针的使用(包含对typedef的分析) #### 一、函数指针基础 在C++中,函数也是一种可以被指针指向的数据类型,这就是所谓的“函数指针”。函数指针是一种特殊的指针类型,它允许程序员通过指针来...

    typedef用法小结

    例如,我们可以使用 typedef 来定义一个函数指针类型别名。例如,typedef void (*Fun)(void); 这里 Fun 就是 void (*)(void) 的别名,即一个函数指针类型别名。 typedef 是一个非常有用的语句,它可以帮助我们创建...

    15年试卷1

    6. **typedef 与指针**: `typedef int *ptr;`声明了一个新的类型别名`ptr`,代表指向整数的指针。因此,`ptr p1, p2;`声明了两个`ptr`类型的变量,即两个指向整数的指针。选项B是正确的。 7. **结构体与条件语句*...

    typedef的用法

    本文将深入探讨`typedef`的使用方法,以及它如何与函数指针相结合。 首先,`typedef`的基本用法是定义类型别名。例如,我们可以为整型定义一个新的名字`int32_t`: ```c typedef int int32_t; ``` 这样,当我们...

    typedef 命令详解和用法

    1. **别名与原始类型的关系**:`typedef`定义的别名实际上是与原始类型完全等价的,这意味着对别名的操作实际上是对原始类型的操作。因此,在使用别名时,需要确保对其背后的真实类型有足够的了解。 2. **别名与宏...

    typedef的用法及与define的区别

    2. **指针与非指针混淆**:`typedef` 会使得指针和非指针类型看起来相似,如果不注意,可能导致错误。例如,`typedef int* IntPtr;` 和 `IntPtr value = 5;` 这里的`value`实际上是整型指针,而非整数值。 **`...

    C语言中typedef用法-综合文档

    typedef也可以与指针结合使用,以定义指针类型。例如: ```c typedef long byte_4; ``` 上面的代码给已知数据类型`long`起了一个新名字`byte_4`。 4. typedef与#define的区别 typedef与#define都是用来定义新名字...

    2010-2011学年第2学期(2)期末考试试卷A-答卷-参考答案

    11. **typedef与指针**:类型定义`typedef struct Student{...}*Pstu;`创建了新的类型别名`Pstu`,它代表指向结构体的指针。 12. **对象与类**:对象是具体实例,是对现实世界事物的抽象,而类是对一组具有相似属性...

    函数指针_extern_typedef_const_static的基本用法

    定义函数指针的关键在于其类型必须与所指向的函数签名完全匹配,包括返回类型和参数列表。例如,一个接受两个整数并返回整数的函数指针可以这样定义: ```c int (*func_ptr)(int, int); ``` 然后,我们讨论`extern...

    define与typedef 区别

    与 `#define` 相比,`typedef` 更安全,因为它的类型系统会确保新类型符合语法规则。同时,`typedef` 的作用范围通常限于它被定义的地方,不像 `#define` 全局有效。 在涉及到指针和常量时,`typedef` 和 `#define`...

    关于结构体指针类型的强制转换

    #### 二、结构体与指针的基本概念 1. **结构体**:在C语言中,结构体是一种复合数据类型,它可以包含不同类型的数据成员。通过定义结构体,可以方便地组织和管理复杂的数据结构。 ```c struct GPIO_TypeDef { ...

Global site tag (gtag.js) - Google Analytics