int a[5] = {1,2,3,4,5}; int *ptr = (int*)(&a+1); printf("%d,%d",*(a+1),*(ptr-1));
上面代码输出结果是:2,5
sizeof:是一个运算符,类型结果为size_t,在头文件中typedef为unsigned int,值通常在编译时计算好,参数类型可以是数组、指针、类型、对象,函数等。注意对齐问题,要以最长类型计算,得出占用字节的大小。
strlen:是一个函数,只能用char*做参数,且必须是以 结尾,在运行时才能得出结果,返回的是字符的实际长度。
strcpy:函数只用于字符串的拷贝,源字符与目标字符在拷贝时长度不满足拷贝都会导致地址混乱,两字符串重叠则结果混乱,遇到结束符 则终止拷贝。
strncpy:同strcpy,且可自定义拷贝长度,但结果不包含 ,需自己加结束符。
sprintf:函数操作的对象不限于字符串,源对象可以是任意基本类型的数据,主要实现将其他数据类型转换为字符串,遇到结束符停止拷贝。
memcpy:实现将一块内存拷贝到另一块内存,没有类型限制,可指定长度,但同样要注意越界,重叠等问题。
C和C++中的struct有什么不同?和C++的class呢?
C的struct没有权限设置,没有成员函数,没有构造函数,虚构函数等等,是用户自定义的数据类型(UDT)
C++的struct是抽象数据类型(ADT),支持成员函数的定义,几乎与class一致,区别是struct的成员默认是public,class中默认是private的;在用模版的时候只能写template <class Type>或template <typename Type>不能写template <struct Type>;
此外,如果没有多态和虚拟继承,在C++中,struct和class的存取效率完全相同!简单的说就是,存取class的data member和非virtual function效率和struct完全相同!不管该data member是定义在基类还是派生类的。 如果不是为了和C兼容,C++中就不会有struct关键字。
因此建议是:如果不需要与C兼容或传递参数给C程序,不要在C++中用struct。
不用变量实现两个数字交换的代码如下:
a = a ^ b; b = a ^ b; a = a ^ b;
IBOutlet的属性设置为weak是为什么呢?
IBOutlet连接的属性,相当于创建了一个对象,添加到当前VC的View中,view对添加到它上面的控件是强引用的,我们在VC中仅是对其使用,并没有必要拥有它,所以是weak的。将weak改成strong也没问题,当VC释放,则该控件引用计数器会自动减1,紧接着VC的View释放,该控件引用计数器继续减1,并不会造成循环引用。
ARC中属性关键字
atomic,nonatomic,readwrite,readonly,strong,weak,assign,copy,retain,unsafe_unretained,geter=<name>,setter=<name>
默认属性有readwrite,atomic,strong(对象),assgin(基本数据类型)
@synthesize指令高数编译器在编译期间产生getter和setter方法
@dynamic指令告诉编译器在编译期间不自动生成getter和setter方法,主要用于NSManageObject对象的属性声明中
__weak与__block的区别
__block可修饰对象和基本数据类型,被修饰对象可在block中重新赋值,适用于ARC和MRC
__weak只能修饰对象,可避免循环引用,适用于ARC
http://www.cocoachina.com/ios/20160817/17373.html
http://www.cocoachina.com/ios/20160819/17398.html
https://github.com/ChenYilong/iOSInterviewQuestions