zoukankan      html  css  js  c++  java
  • typedef关键字

    typedef作用简介

    •我们可以使用typedef关键字为各种数据类型定义一个新名字(别名)。

      1#include <stdio.h>

     2

     3 typedef int Integer;

     4 typedef unsigned int UInterger;

     5

     6 typedef float Float;

     7

     8 int main(int argc, const char * argv[]) {

     9     Integer i = -10;

    10     UInterger ui = 11;

    11    

    12     Float f = 12.39f;

    13    

    14     printf("%d  %d  %.2f", i, ui, f);

    15    

    16     return 0;

    17 }

    •也可以在别名的基础上再起一个别名
    •typedef int Integer;
    •typedef Integer MyInteger;
     
    二、typedef与指针
    •除开可以给基本数据类型起别名,typedef也可以给指针起别名

     1 #include <stdio.h>

     2

     3 typedef char *String;

     4

     5 int main(int argc, const char * argv[]) {

     6     // 相当于char *str = "This is a string!";

     7     String str = "This is a string!";

     8    

     9     printf("%s", str);

    10    

    11     return 0;

    12 }

    三、typedef与结构体

     1 // 定义一个结构体

     2 struct MyPoint {

     3     float x;

     4     float y;

     5 };

     6

     7 int main(int argc, const char * argv[]) {

     8     // 定义结构体变量

     9     struct MyPoint p;

    10     p.x = 10.0f;

    11     p.y = 20.0f;

    12    

    13     return 0;

    14 }

    2.使用typedef给结构体起别名

     1 // 定义一个结构体

     2 struct MyPoint {

     3     float x;

     4     float y;

     5 };

     6

     7 // 起别名

     8 typedef struct MyPoint Point;

     9

    10 int main(int argc, const char * argv[]) {

    11     // 定义结构体变量

    12     Point p;

    13     p.x = 10.0f;

    14     p.y = 20.0f;

    15    

    16     return 0;

    17 }

    // 定义一个结构体,顺便起别名

    typedef struct MyPoint {

        float x;

        float y;

    } Point;

    甚至可以省略结构体名称:

    typedef struct {

        float x;

        float y;

    } Point;

    三、typedef与指向结构体的指针
     

     1 #include <stdio.h>

     2

     3 // 定义一个结构体并起别名

     4 typedef struct {

     5     float x;

     6     float y;

     7 } Point;

     8

     9 // 起别名

    10 typedef Point *PP;

    11

    12 int main(int argc, const char * argv[]) {

    13     // 定义结构体变量

    14     Point point = {10, 20};

    15    

    16     // 定义指针变量

    17     PP p = &point;

    18    

    19     // 利用指针变量访问结构体成员

    20     printf("x=%f,y=%f", p->x, p->y);

    21     return 0;

    22 }

    五、typedef与指向函数的指针

    1 #include <stdio.h>

     2

     3 // 定义一个sum函数,计算a跟b的和

     4 int sum(int a, int b) {

     5     int c = a + b;

     6     printf("%d + %d = %d", a, b, c);

     7     return c;

     8 }

     9

    10 int main(int argc, const char * argv[]) {

    11     // 定义一个指向sum函数的指针变量p

    12     int (*p)(int, int) = sum;

    13    

    14     // 利用指针变量p调用sum函数

    15     (*p)(4, 5);

    16    

    17     return 0;

    18 }

     1 include <stdio.h>

     2

     3 // 定义一个sum函数,计算a跟b的和

     4 int sum(int a, int b) {

     5     int c = a + b;

     6     printf("%d + %d = %d", a, b, c);

     7     return c;

     8 }

     9

    10 typedef int (*MySum)(int, int);

    11

    12 int main(int argc, const char * argv[]) {

    13     // 定义一个指向sum函数的指针变量p

    14     MySum p = sum;

    15    

    16     // 利用指针变量p调用sum函数

    17     (*p)(4, 5);

    18    

    19     return 0;

    20 }

    六、typedef与#define 

    1 typedef char *String;

    2

    3 int main(int argc, const char * argv[]) {

    4     String str = "This is a string!";

    5     return 0;

    6 }

    ---------------

    1 #define String char *

    2

    3 int main(int argc, const char * argv[]) {

    4     String str = "This is a string!";

    5     return 0;

    6 }

     ---------

     1 typedef char *String1;

     2

     3 #define String2 char *

     4

     5 int main(int argc, const char * argv[]) {

     6     String1 str1, str2;

     7    

     8     String2 str3, str4;

     9     return 0;

    10 }

    •第一行给char *起了个别名String1,第2行定义了宏String2。然后在第6、第8行定义了4个变量。
    •重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。
    • 
    •下面简单分析一下原因:
    •* 如果连续声明两个int类型的变量,我们可以这样写:
    •int a, b;
    •上面的代码相当于:
    •int a;
    •int b;
    •* 以此类推
    •1 typedef char *String1;
    •2    
    •3 String1 str1, str2;
    •经过typedef处理后,String1也算是一种数据类型,所以第3行代码相当于
    •1 String1 str1;
    •2 String1 str2;
    •由于String1就是char *,所以上面的两行代码等于
    •char *str1;
    •char *str2;
     
    •* 再看看宏定义的情况
    •1 #define String2 char *
    •2
    •3 String2 str3, str4;
    •因为宏定义纯粹是字符串替换,用char *代替String2,所以第3行代码相当于
    •char * str3, str4;
    •其实也就相当于:
    •char * str3;
    •char str4;
    •可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。
    •所以,以后给类型起别名,最好使用typedef,而不是使用#define

  • 相关阅读:
    Django中自定义标签的所有步骤
    django的settings详解(1)
    django中@property装饰器的运用
    设计没有标准,只有目标
    小学的题 大学的解法
    中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动圆满结束
    中国移动创新系列丛书《OPhone应用开发权威指南》读者交流活动
    开源软件技巧与精髓分享
    博文视点大讲堂28期:助你赢在软件外包行业
    网络营销大师力作,亚马逊营销图书传奇
  • 原文地址:https://www.cnblogs.com/ShaoYinling/p/4561133.html
Copyright © 2011-2022 走看看