您的位置:首页 > 职场人生

iOS面试题

2016-06-14 16:32 211 查看
1. 打印结果

 
1
2
3
4
5
6
7
8
 
main(){
  inta[5]={1,2,3,4,5};
  int*ptr=(int*)(&a+1);
  
  printf("%d,%d",*(a+1),*(ptr-1));
}
 
答案:2,5
笔者解析:
这里数组a初始化为{1,2,3,4,5},ptr是一个指向int
*类型的指针,其初始值为(int *)(&a+1)。实际上,&a+1不是首地址+1,系统会认为加数组a的偏移,是偏移了一个数组的大小(本例是5个int)
a+1是指针+1,就指向了数组a的第二个元素,而当于ptr当前所指向的值。所以,*(a+1)的值就是2。
ptr-1是二维指针-1操作,因此指向了数组a最后一个元素的地址,所以*(ptr-1)的值为数组第一个元素值5。
2. 输出结果
 
1
2
3
4
5
6
7
 
voidFunc(charstr[100]){  

    sizeof(str) =
?
}
 
void*p =
malloc(100);sizeof(p)
= ?
 
答案:4
笔者解析:
这道题很常见,Func(char str[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。32位平台下,指针的长度(占用内存的大小)为4字节,所以sizeof(str)和sizeof(p)都为4。
3. 数组和指针的区别
这种题连大学考试都很爱考吧。
参考答案:
•  数组可以申请在栈区和数据区;指针可以指向任意类型的内存块
•  sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小
•  数组名表示数组首地址,是常量指针,不可修改指向。比如不可以将++作用于数组名上;普通指针的值可以改变,比如可将++作用于指针上
用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组

4. 简述内存分区情况
如果问到这种问题,通常是想考考到内存的理解程度。
参考答案:
•  代码区:存放函数二进制代码
•  数据区:系统运行时申请内存并初始化,系统退出时由系统释放,存放全局变量、静态变量、常量
•  堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
栈区:函数模块内申请,函数结束时由系统自动释放,存放局部变量、函数参数

5.堆与栈的区别
上次我面了一位来面试iOS的研究毕业生,什么是栈?结果答成了堆。想想可知大学里都干什么去了。
参考答案:
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。 栈空间是有限的,而堆是很大的自由存储区。
C中的malloc函数分配的内存空间是在堆上的,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: