iOS面试题
2016-06-14 16:32
211 查看
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. 输出结果
答案:4
笔者解析:
这道题很常见,Func(char str[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。32位平台下,指针的长度(占用内存的大小)为4字节,所以sizeof(str)和sizeof(p)都为4。
3. 数组和指针的区别
这种题连大学考试都很爱考吧。
参考答案:
• 数组可以申请在栈区和数据区;指针可以指向任意类型的内存块
• sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小
• 数组名表示数组首地址,是常量指针,不可修改指向。比如不可以将++作用于数组名上;普通指针的值可以改变,比如可将++作用于指针上
用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组
4. 简述内存分区情况
如果问到这种问题,通常是想考考到内存的理解程度。
参考答案:
• 代码区:存放函数二进制代码
• 数据区:系统运行时申请内存并初始化,系统退出时由系统释放,存放全局变量、静态变量、常量
• 堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
栈区:函数模块内申请,函数结束时由系统自动释放,存放局部变量、函数参数
5.堆与栈的区别
上次我面了一位来面试iOS的研究毕业生,什么是栈?结果答成了堆。想想可知大学里都干什么去了。
参考答案:
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。 栈空间是有限的,而堆是很大的自由存储区。
C中的malloc函数分配的内存空间是在堆上的,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。
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)); } |
笔者解析:
这里数组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) = ? |
笔者解析:
这道题很常见,Func(char str[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。32位平台下,指针的长度(占用内存的大小)为4字节,所以sizeof(str)和sizeof(p)都为4。
3. 数组和指针的区别
这种题连大学考试都很爱考吧。
参考答案:
• 数组可以申请在栈区和数据区;指针可以指向任意类型的内存块
• sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小
• 数组名表示数组首地址,是常量指针,不可修改指向。比如不可以将++作用于数组名上;普通指针的值可以改变,比如可将++作用于指针上
用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组
4. 简述内存分区情况
如果问到这种问题,通常是想考考到内存的理解程度。
参考答案:
• 代码区:存放函数二进制代码
• 数据区:系统运行时申请内存并初始化,系统退出时由系统释放,存放全局变量、静态变量、常量
• 堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
栈区:函数模块内申请,函数结束时由系统自动释放,存放局部变量、函数参数
5.堆与栈的区别
上次我面了一位来面试iOS的研究毕业生,什么是栈?结果答成了堆。想想可知大学里都干什么去了。
参考答案:
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。 栈空间是有限的,而堆是很大的自由存储区。
C中的malloc函数分配的内存空间是在堆上的,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。
相关文章推荐
- 面试题2
- 不会赛车的程序员不是一个好作家
- 剑指offer - 面试题28:字符串的排列(递归+去重)
- 栈和队列相关面试题(2)
- 难倒英雄好汉的“自我评价”
- 剑指offer-面试题12:打印1到最大的n位数
- [读书笔记]《Java程序员修炼之道》
- 单例设计模式(Singleton Pattern)完全解析
- 链表面试题(一)
- 栈和队列相关面试题(1)
- 面试题9:递归和非递归
- 面试题22 栈的压入、弹出序列
- Java程序员也应该知道的系统知识系列之(网卡,cpu,内存,硬盘,虚拟化)
- 编程之法:面试和算法心得
- 要准备了:JAVA面试题及答案汇总
- 腾讯面试全程
- 面试腾讯全过程
- 程序员,应该掌握的英语词汇
- 面试题21 包含Min函数的栈
- 非技术相关的面试技巧(文章内容来自他人博客)