Object-C学习(五):结构体(struct)、typedef、以及与#define宏定义的区别

来源:互联网 发布:手机定位模拟软件 编辑:程序博客网 时间:2024/04/29 11:32

结构体:

  结构体是一种数据类型的组合和数据抽象。

   基本格式如下:

       struct complex_struct{

           double x, y;

       };

   这样就定义了一个由两个double类型组成的结构体,complex_struct是标示符,这种标示符成为Tag,我们可以把它的整体看做一个类型名,如果你想声明一个这种类型的变量可以像声明其他数据类型的变量一样,如下:

      struct complex_struct{

           double x, y;

       }z1, z2;

   像这样声明了z1,z2两个变量,如果想要给他们赋值可以直接z1.x = 10; z1.y = 20;

   

   结构体{}内可以定义多个变量,他们之间用“,”号隔开。


   结构体变量也可以在初始化的时候直接定义:struct complex_struct z1 = { 10,20 };

   {}语法不能用于结构体的赋值,下面是一种错误的用法:

   struct complex_struct z1;

   z1 = { 10, 20 };

 

typedef关键字:

  typedef是C语言的关键字,作用是为一种数据类型定义一个新的名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

   使用它有两个目的,一个是给变量一个容易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

   下面就简化一下上面定义的结构体:

typedef struct complex_struct{    double x,y;}myStruct;myStruct a = {10.0,20.0};NSLog(@"%f",a.x);

这样在我们想定义一个struct类型的变量时,就不用struct  complex_struct   z1 = { 10,20 }这么麻烦的写了。

struct complex_struct{

           double x, y;

       }

就等价与mystruct。

想更加深入的了解struct  请去这里


#define宏定义预处理指令

#define是一种预处理指令,比如你可以通过这样 #define  PI  3.1415926 预定义一个π,在你的程序里可以当用到π值的时候直接使用PI代替3.1415926。它只是一个简单的替换,并且除了可以替换一个常量以外,也可以替换一些条件判断、函数等。如:#define    Loop_10    for (int i=0; i<10; i++)。而且可以用 #ifdef ,#ifndef等来进行逻辑判断,还可以使用#undef来取消定义。

而typedef不是简单的文本替换,看下面这个从百度百科拿来的例子,很好的对它们做了比较:



       typedef char* pStr1;

#define pStr2 char *
pStr1 s1, s2;
pStr2 s3, s4;
在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。
上例中define语句必须写成 pStr2 s3, *s4; 这这样才能正常执行。