Objective-c 学习笔记(四)

一、数组
  • 定义数组: 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 和CGPoint
    struct 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]



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值