指针与二维数组

通过前面的学习,已知: int arr[3]={1,3,5}; arr[0] 可以用 *(arr+0) 表示 arr[1] 可以用 *(arr+1) 表示 arr[2] 可以用 *(arr+2) 表示 现有二维数组如下: int arr[3][4]= { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} }; 则: arr[0] ~~~ *(arr+0) arr[1] ~~~ *(arr+1) arr[2] ~~~ *(arr+2) 此处arr[0]即*(arr+0)是二维数组arr的第一个元素的值,该值是内层数组{1,2,3,4}的起始地址. 将arr[0]赋值给 temp数组 int temp0[4] = arr[0]; int temp1[4] = arr[1]; int temp2[4] = arr[2]; 获取最终的值: arr[0][0] ~~~~ 将arr[0]换为上边的temp0数组 arr[0][0] ~~~~ temp0[0] ~~~~ *(temp+0) ~~~~ *(*(arr+0)+0) arr[0][1] ~~~~ temp0[1] ~~~~ *(temp+1) ~~~~ *(*(arr+0)+1) arr[0][2] ~~~~ temp0[2] ~~~~ *(temp+2) ~~~~ *(*(arr+0)+2) arr[0][3] ~~~~ temp0[3] ~~~~ *(temp+3) ~~~~ *(*(arr+0)+3) arr[1][0] ~~~~ 将arr[1]换为上边的temp1数组...

July 24, 2014

Objective-C 正则表达式的使用

前言: 编程中,对于字符串的处理是无处不在的.时常需要在一堆乱码中找到有用的信息.比如在如下的字符串中获取有效的 URL 或 Email ababsdbasbdabdhttp://baidu.com <div>test@test.com<div> 诸如此类问题,我们都可以通过正则表达式来解决,正则在任意编程语言都有对应实现. iOS4 之后,Cocoa 也提供了用于正则的 NSRegularExpression 和 NSTextCheckingResult 这两个类. 前者用于创建正则,匹配,替换;后者是一个快速匹配对象,可用于检查拼写,URL等,也可作为正则匹配的结果,包含匹配到子串所在 range 和匹配规则. 创建: NSRegularExpression * regex = [NSRegularExpression regularExpressionWithPattern:@"http[s]?://[A-z0-9.-]*" options:NSRegularExpressionCaseInsensitive error:nil]; 正则匹配模式 [] 表示集合, * 表示 出现零次或多次, ? 表示出现零次或一次, http[s]?://[A-z0-9.-]* ,即匹配以 http:// 或 https:// 开头,含有零或多个字母 - . 的字符串 option NSRegularExpressionCaseInsensitive //忽略大小写 NSRegularExpressionAllowCommentsAndWhitespace //忽略空格,回车,tab,注释 NSRegularExpressionIgnoreMetacharacters //忽略 Meta NSRegularExpressionDotMatchesLineSeparators //允许使用 . 通配任何符号,包括换行符 NSRegularExpressionAnchorsMatchLines //允许使用 ^ $匹配行头和行尾 NSRegularExpressionUseUnixLineSeparators //只把 \n 当做换行符 NSRegularExpressionUseUnicodeWordBoundaries 应用: NSRegularExpression 提供了对字符串 匹配 , 替换 的函数,...

May 29, 2014

在iOS开发中使用block

今天下午把启动了一周的项目重构了一下,用storyboard做界面(之前是代码+xib),block做回调(之前是delegate)。 关于storyboard和block都已经出现好几个年头了,从开发效率上来看,这俩东西再配合ARC上简直是倚天屠龙。 在之前的项目中,回调需要做以下几步: A类中声明ProtocolA协议及协议下的方法。 A类中声明delegate属性。 B类实现ProtocolA协议以及协议下的方法,并将自身对象赋值给A类对象的delegate属性。 当需要实现回调的时候,直接通过A类对象的delegate属性调用 ProtocolA协议下的方法即可执行B类中对该协议方法的实现。 以前大伙都在这样乐呵乐呵的写,但是有了block之后,步骤变得简单了许多。 用block做回调省了哪些事儿? 不用定义协议及协议方法。 减少冗余,即不需要为回调而创建B并实现协议方法。 闭包特性,使的代码更为紧凑,表达更为直观,即不需要把业务逻辑分散到多个方法中。 废话少说,上代码。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 #import <Foundation/Foundation....

January 13, 2014

函数指针和类成员指针

函数指针和类成员指针经常被用作参数进行传递,多态和函数重载都会用到. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include <iostream>#include <string>#include <string.h>using namespace std; class Demo { public: void show() { cout << "member method Demo::show() did call" << endl; str = "str from Demo::show()"; } string str; }; void show() { cout<<"普通函数指针被调用"<<endl; } int main(int argc, char* argv[]) { //普通函数指针 //将普通函数show的地址赋值给pPainShow,优先级原因,必须在(*pPainShow)外加小括号, //否则编译器会将此认为是一个void* pPainShow(); 的函数声明,显然,我们不是这个意思....

November 3, 2013

指针常量和常量指针

这一概念经常混淆,故写下来,以备不时之需 1 2 3 4 5 6 7 8 int a = 10; int * const b = &a;//const修饰b,b本身不可变,但是*b可变;人称常量指针,即指针是常量,地址不可改变 *b = 20;//更换值 cout << *b << endl; int const * bb = &a;//const修饰*bb,*bb不可变,但是bb可变;人称指针常量,指向常量的指针,值不可以变,地址可以改变 int c = 30; bb = &c;//更换指向 cout << *bb << endl;

November 3, 2013