码迷,mamicode.com
首页 > 编程语言 > 详细

typedef 指针 数组

时间:2016-01-17 17:35:13      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

1、整型指针

typedef int* PINT;

typedef int *PINT;

2、结构体

typedef struct {
  double data;
}DATA,  *PDATA;  //DATA是结构体类型别名,PDATA是结构体指针类型的别名

3、函数指针

#include<iostream>
using namespace std;

void say()
{
    cout << "hello world" << endl;
}

int main()
{
    void (*p)() = &say; //声明函数指针局部变量并初始化
    (*p)();//或p();
    return 0;
}

函数名类似数组名。
  int a[100];定义了数组变量a,a是int [100]类型,是个数组类型。但int *p = a;竟可以把变量a直接赋给int*型变量p,但两者类型是不一样的。这是因为其中包含隐式的转换,a转换为了指向数组地址的指针常量,即int* const类型 。不含隐式转换的写法应该这样:int *p = &a[0];             

  而函数void say();声明了函数say,say是void (void)类型,是个函数类型。上例的函数指针p可以 p=&say或p=say赋值。p=say时,say隐式转换为了指向函数地址的函数指针常量,即void say(* const)()类型。调用时也可进行反向转换,所以p();或(*p)();都可以调用函数!

 

可用typedf声明函数指针类型

typedef void (*)() S; //error,格式不正确
typedef void (*S)(); //ok!

举例:

#include<iostream>
using namespace std;

void say1()
{
    cout << "say1" << endl;
}

void say2()
{
    cout << "say2" << endl;
}

int main()
{
    typedef void (*SAY)(); //声明局部类型
    SAY s; 
    s = say1;
    s(); //或 (*s)();
    (s = say2)(); //直接调用
    return 0;
}

这里是在main函数里声明的局部类型。当然,也可放在全局或类作用域中

 

4、函数指针数组

  先说一下,[]的优先级很高的,和()  .  ->这3个同处于最高优先级

void ((*p)[2])();//编译出错:‘p‘ 数组元素类型不能是函数
void (*p[2])() = {say1, say2}; //ok;
p[0]();
(*p[1])();

上面,p是一个数组,含两个元素,元素类型是函数指针void (*)()  。

//不建议
typedef void (*S[2])();
cout << sizeof(S) << endl;//8
S a = {say1, say2};

//建议,更易懂
typedef void (*S)();
S a[2] = {say1, say2};

 

4、返回值、形参含函数指针

int (*S)(int i, void (*p)()); //声明一个函数指针S,指向一函数。该函数返回值类型为int,有两个参数:int变量i和函数指针p。

int* (*r)() (*S[2])(void (*p1)(), int& (*p2[3])(int*, int*));//声明一数组。但vs2013编译错误

上面太复杂,编译器无法正常处理,你甚至可以编写更复杂的声明。用typedef可简化声明:

typedef int* (*RTN)();//返回值:函数指针
typedef void (*P1)();//参数1:也是函数指针
typedef int& (*P2)(int*, int*);

typedef RTN (*S)(P1, P2[3]);
S a[2];//声明

 

用typedef化繁为简,声明时可大大简化代码,且更易读!

 

typedef 指针 数组

标签:

原文地址:http://www.cnblogs.com/sfqh/p/5137366.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!