C语言中的特性在Objective C中的应用 Objective C继承和多态 NSNumber和NSString 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 = &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; } Objective C继承和多态 NSNumber和NSString