C语言中的特性在Objective C中的应用


C语言中的特性在Objective C中的应用

内容概述

  • 预处理
  • 数组
  • 指针
  • 结构体

10.1 预处理

预处理有很多预处理命令组成,这些命令在编译之前处理,故称为"预处理"。预处理功能包括三种:宏定义、文件包含和条件编译。

宏定义

宏定义又称宏替换,是将定义的标示符替换成后面的字符串。宏定义语法格式如下:#define 标示符 字符串,例如 #define PI 3.14。在程序中会自动把出现PI的地方替换为3.14。下面代码定义表了一个PI宏,并且在计算面积中使用它。

// 宏定义

#define PI 3.14

float area(float r){

    // 宏替换

    float area = PI*r*r;

    return area;

}

宏定义是可以嵌套的,即一个宏引用另外一个宏。例如。

// 宏定义的嵌套

#define W  10

#define H  (W+10)

#define AREA  (W*H)

除了基本的宏定义外,还有参数宏,参数宏很像函数,可以为其传递参数。参数宏的语法格式如下:

#define宏名称 (参数表)表达式,例如下面两个宏分别用来定义了求平方和求和。

// 求平方

#define SQUARE(x) (x)*(x)

// 求和

#define SUM(a,b) (a)+(b)

int s = SUM(1, 2);

NSLog(@"sum=%d",s);

int sq = SQUARE(5);

NSLog(@"sq=%d",sq);

文件包含

文件包含可以在一个文件中包含另外一个定义好的文件,这样可以将两个问文件的内容合并在一起。语法格式如下#include (文件名称)。下面我们定义了一个头文件,并在另外一个文件中包含它。

//

//  Test.h

//  chapter10-0

//

//  Created by amaker on 5/14/13.

//  Copyright (c) 2013 amaker. All rights reserved.

//

#define TEST1 123

#define SUM1(a,b) (a)+(b)

// 文件包含

#include "Test.h"

这样在包含文件中就可以使用 TEST1宏和SUM1宏了。

条件编译

条件编译是对编译的源码进行控制。可以像使用条件语句语法一样使用条件编译语法。根据不同的条件来控制参加编译的内容,因此,成为"条件编译"。

语法格式如下:

#ifdef  标示符

程序段1

#else

程序段2

#endif

下面的例子演示了如果是iPad,那么定义屏幕宽度为768,否则屏幕宽度为320.

// 条件编译

#define iPad TRUE

#ifdef iPad

#define SIZE  768

#else

#define SIZE  320

#endif

10.2 数组

所谓数组,就是在内存中一块连续的存储单元,数据存在于这些单元中。和变量一样,使用数组前需要声明数组,声明数组需要指定数组中保存的数据类型,数组的大小一旦确定不可修改。

数组的声明

数组的声明语法格式是 数据类型 数组名称[大小].例如,int array[5], char array2[3]等。还可以在声明时直接赋值,int array3[] = {1,2,3}.

数组的初始化

数组中每个变量成为数组的元素,可以通过下标的方式来访问数组中的元素。通过这种方式可以给数组赋值,并且可以访问数组中的元素值。

void initArray(){

    // 定义数组并初始化,大小为5

    int array[5];

    array[0]=1;

    array[1]=2;

    array[2]=3;

    array[3]=4;

    array[4]=5;

    // 访问数组中的元素

    NSLog(@"array[0]=%d",array[0]);

    NSLog(@"array[1]=%d",array[1]);

    // 定义数组并初始化,大小为4

    int array2[] = {100,200,300,400};

    NSLog(@"array2[0]=%d",array2[0]);

}

遍历数组

我们经常可以循环的来访问数组中的元素,这就是遍历数组,可以通过for循环的方式来遍历数组中的元素。例如,下面代码定义了一个数组,通过循环的方式为数组赋值,并通过循环的方式访问数组中的元素。

void loopArray(){

    // 定义数组大小

    int size = 5;

    // 根据大小定义数组

    int array[size];

    // 循环初始化数组

    for (int i=0; i<size; i++) {

        array[i]=i+1;

    }

    // 遍历数组

    for (int i=0; i<size; i++) {

        NSLog(@"array[%d]=%d",i,array[i]);

    }

}

10.3 指针

指针是c语言中非常重要的概念,理解指针对理解程序和内存有很大帮助。另外,指针也很复杂,详细的讲述已经超出了本书的讲述范围。

简单的理解指针就是保存变量地址的变量。通过这个地址我们可以找到该变量,就像我们的家庭住址,我们把它告诉好友,好友就可以通过它找到家了。

定义一个指针变量要在前面加,取一个变量的地址要使用&符号。下面代码就定义了一个int类型的变量,并取变量的地址,并赋值给指针变量p。p代表指针指向的变量值,赋值给变量j。

#import <Foundation/Foundation.h>

void testPoint(){

    // 定义一个int类型变量

    int i = 100;

    // 取i的地址赋值给指针变量p

    int *p = &amp;i;

    // *p代表指针指向的变量值,赋值给变量j

    int j = *p;

    NSLog(@"i=%d",*p);

    NSLog(@"j=%d",j);

}

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

{

    @autoreleasepool {

        testPoint();

    }

    return 0;

}

程序输出结果如下所示。

10.4 结构体

我们可以将描述某个事物的一组变量定义为结构体。和数组类似结构体也是集合变量,不同的是机构体可以定义不同类型的变量。例如,我们可以定义一个人Person结构体,该结构体变量中可以定义int类型的年龄、字符串类型的姓名和布尔类型的婚否等。

结构体的语法结构如下:

struct 结构体名称{

    变量列表;

};

下面代码定义了一个点Point结构体,和一个矩形结构体Rect,矩形结构体嵌套Point点结构体,并声明点Point结构体和矩形Rect结构体,为其赋值,并输出结果。

#import <Foundation/Foundation.h>

// 定义一个点结构体,有两个坐标x,y

struct MyPoint{

    int x;

    int y;

};

// 定义一个矩形结构体,嵌套

struct MyRect{

    // 左定点坐标

    struct MyPoint point;

    // 宽

    int w;

    // 高

    int h;

};


// 声明一个点

struct MyPoint point;

// 声明一个矩形

struct MyRect rect;

// 测试,给结构体赋值

void testStruct(){

    point.x = 1;

    point.y = 2;

    rect.point = point;

    rect.w = 200;

    rect.h = 150;

    NSLog(@"x=%d,y=%d,w=%d,h=%d",point.x,point.y,rect.w,rect.h);

}

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

{

    @autoreleasepool {

        testStruct();

    }

    return 0;

}