一、数组
- 定义数组: Fraction *fracts [100];
- 可以在定义时赋初值 int integers[5] = {0, 1, 2, 3, 4};
- 不必初始化所有元素:容量为10的数组,只初始化了前三个,其余的会自动被初始化为0
- int x = 123;
- 不必按顺序初始化数组元素: int a[] = { [9]=x+1; [2] = 3, [1] =2}
- 如果字符数组结尾添加了一个终止控制符'\0',就产生了一个字符串变量。
- 如 char word[] = {'H', 'e', 'l', 'l', 'o', '!', \0'};
- 随后,就可以用NSLog显示这个字符串: NSLog (@"s%", word);
- 二维数组的引用 M[i][j]
- 二维数组的初始化 int M[4][5] = { {1,2,3,4,5}, {2,3,4,5,6}, {1....}; 注意:数组间需要加逗号
二、函数
- Objective-c语言假设函数的默认返回值是整型值。无论调用一个什么函数,编译器都会假设返回类型为int
- main函数,NSLog函数
- void printMessage (void) 第二个void是告诉编译器这个函数没有任何参数
- 如果省略函数的返回类型,如果函数确实返回任何值,编译器会假设该值为整数。单不应省略,不是好习惯
- 函数和方法默认的返回类型不同。如果没有未方法指定返回类型,编译器假设它返回id类型。
- 如果函数的参数数目补丁,比如NSLog和scanf,必须告知编译器,如下声明:void NSLog(NSString *format, ...);
- 函数与方法的区别。定义方式不同,所属不同。
三、块 Blocks
- 块是apple加的,对C语言的扩展,不是标准ANSI C的部分
- 看起来像函数。也有参数,也有返回值。不同的是,块定义在函数或者方法的内部。
- 函数 void printMessage(void){ NSLog(@"aaa");} 的功能可以被块同样完成: ^(void){ NSLog(@"aaa");}
- 块以^开头为标识。后面的括号表示参数列表
- 块可以赋值给变量 void (^printMessage)(void) = ^(void){NSLog(@"aaa");};。表示printMessage指向一个块指针。
- 执行一个变量引用的块,与函数调用的方式一致。 printMessage();
- 块也是可以有返回值的 int(^gcd) (int, int) = ^(int u, int v){..};
- 块可以访问在其范围内定义的变量。
- 容易出问题的地方:
int foo=10;void (^printFoo) (void) = ^(void){ NSLog (@"foo=%i", foo);};foo = 15;printFoo();这时会显示的是10,而不是15。块定义的时候,已经有值了。
- 不可以在块外部(错了吧?内部)修改已经定义过变量的值。如果视图在块内部改foo的值,会编译器报错。(有特殊情况)
- 如果在本地变量前插入__block修改器, __block int foo = 10; 则可以修改foo的值。
- 同数组 一样,是组合元素的工具。
- 定义:struct date{ int month; int day; int year;}; 之间是分号。
- 使用: struct date today, tomorrow;
- 属性访问方法:today.day = 21;
- 初始化:
- 类似于数组 struct date today = {3, 3, 2000};。
- 同数组一样,可以部分初始化。
- 可以任意顺序初始化:struct date today = {.month =7, .day = 2, .year=2000};
- 结构中的结构:以IOS中常用的矩形为例
struct CGPoint{CGFloat x;CGFloat y;);typedef struct CGPoint CGPoint; //stcut CGPoint 和CGPointstruct CGSize{CGFloat width;CGFloat height;};typedef struct CGSize CGSize;struct CGRect{CGPoint origin;CGSize size;};typedef struct CGRect CGRect使用typedef之后,就不需要再使用struct了。直接CPPoint startPt; startPt.x = 111;startPt是一个结构,而不是一个对象。(特征是前面没有星号)
- 定义结构的同时,可以定义变量,还可以给变量赋初值。还可以省略结构名。
- int *intPtr = &count; //*表示变量intPtr是int的指针类型;&用于获取指向变量地址的指针。
- 如果要通过指针变量引用coutn的内容,可以通过间接寻址运算符,即星号(*)。如果x是int类型,那么语句x=*intPtr;
- &地址运算符 *间接寻址运算符
- 指向结构体的指针 (*dataPtr).month = 12;
- 结构指针运算符 -> (*x).y 可以用x->y表示
- 指向数组的指针
- 不能将指针定义为指向数值的指针,应该是指向数组中元素的指针。
- Fraction **fractsPtr; 要把fracts指向values的第一个元素,可以直接写valuesPtr = value;
- 这儿不需要地址运算符,因为Object-c本来就把没有下标的数组名视为指向数组第一个元素的指针。
- 还可以写为 valuesPtr = &values[0]; 多此一举
- 可以用 *(valuesPtr + 10)来表示 values[10]
- 如果valuesPtr 指向[0],可以用valuesPtr++来指向[1]