### Object-C重要面试题知识点解析 #### 一、数组与指针运算理解 **题目描述:** ```c int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); ``` **解析:** 此题主要考察对数组和指针的理解。 1. **数组与指针关系:**在C语言中,数组名`a`默认可以被视为指向数组第一个元素的指针。例如,`*(a+1)`相当于`a[1]`。 2. **数组指针与普通指针的区别:**`&a`代表整个数组的地址,而非数组第一个元素的地址。因此,`&a+1`实际上是在当前数组的基础上移动了一个数组的大小,而不是简单地移动一个元素的大小。 3. **偏移量计算:**由于`a`是一个包含5个`int`类型的数组,当使用`&a+1`时,实际上是加上了`5*sizeof(int)`的偏移量。因此,`int *ptr=(int *)(&a+1);`后的`ptr`实际上指向的是`a`之后5个`int`的位置,即`a[5]`的位置。 4. **`ptr-1`操作:**`ptr`是指向`a[5]`的地址,减去1意味着回到`a[4]`的位置。 **结论:** - `*(a+1)`即`a[1]`,输出为2; - `*(ptr-1)`即`a[4]`,输出为5。 #### 二、`sizeof`运算符的理解 **题目描述:** ```c void Func(char str[100]) { sizeof(str) = ? } void *p = malloc(100); sizeof(p) = ? ``` **解析:** 1. **函数参数传递时的数组退化:**在C/C++中,当数组作为函数参数传递时,它会被退化为指向该数组第一个元素的指针。因此,在`Func`函数内,`str`实际上是一个指向`char`类型的指针。 2. **`sizeof`运算符:**`sizeof`运算符用于获取数据类型或变量的大小。当`str`被视为指针时,其大小取决于编译器环境。在32位环境下,所有指针通常占4字节。 3. **`malloc`分配内存:**`void *p = malloc(100);`为`p`分配了100字节的内存,`sizeof(p)`获取的是`p`指针的大小,同样在32位环境下为4字节。 **结论:** - `sizeof(str)`的结果为4字节。 - `sizeof(p)`的结果也为4字节。 #### 三、Objective-C中返回值与内存管理 **题目描述:** ```objective-c -(void *)getNSString(const NSString *inputString){ inputString = @"This is a main test\n"; return inputString; } -main(void){ NSString *a=@"Main"; NSString *aString = [NSString stringWithString:@"%@",getNSString(a)]; NSLog(@"%@\n", aString); } ``` **解析:** 1. **返回`NSString`对象:**`getNSString`方法试图修改传入的`inputString`,但在Objective-C中,`inputString`是传值调用,不会影响原变量。 2. **内存管理:**`getNSString`返回的是一个临时`NSString`对象的引用,该对象将在方法退出后被销毁。 3. **`NSLog`输出:**`aString`实际上指向了一个已经释放的对象,输出结果不可预测,可能会是`nil`或随机值。 **结论:** - 方法`getNSString`返回的对象在其作用域外无效,可能导致程序崩溃或未定义行为。 #### 四、预处理指令与宏定义 **题目描述:** ```c #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL #define MIN(A,B)((A) <= (B) ? (A) : (B)) ``` **解析:** 1. **宏定义:**`#define`用于定义宏。在本例中,`SECONDS_PER_YEAR`定义了一年的秒数,并使用`L`指定为长整型。 2. **宏替换:**宏定义会在编译前进行替换,无需计算结果,由编译器自动完成计算。 3. **宏`MIN`实现:**`MIN`宏通过三元运算符实现了返回两个参数中的较小值功能。使用了括号来确保参数正确传递,避免因操作符优先级问题导致的错误。 **结论:** - 使用宏定义可以方便地定义常量,需要注意宏定义的语法及括号使用规则。 - 宏`MIN`是一种常见的最小值比较宏,需要注意宏展开时的运算符优先级问题。
剩余11页未读,继续阅读
- 粉丝: 507
- 资源: 4811
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助