iOS面试题
来源:互联网 发布:苹果电脑mac支持千牛吗 编辑:程序博客网 时间:2024/06/05 19:24
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操作符。 程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。
- iOS技术面试题
- ios面试题
- IOS面试题
- ios基础面试题
- IOS 面试题
- iOS开发面试题
- iOS 面试题二
- iOS面试题
- IOS 面试题
- ios 面试题
- IOS面试题详解
- ios面试题
- iOS面试题汇总
- ios基础面试题
- IOS面试题归总
- IOS面试题详解
- IOS面试题详解
- ios面试题
- 图像形态学操作—腐蚀膨胀深入
- 关于iOS多线程
- 二级指针做输出模型
- proc rank
- 每日命令:安装新软件
- iOS面试题
- 经典jdbc 原生操作,附简单操作demo
- opecv VideoCapture open avi file failed
- 通过xml文件注册信息,得到对应的类进行处理
- erlang中的错误处理
- C语言中的static 详细分析
- 使用构造器创建bean
- iOS 10 beta1 安装
- Android开发中,有哪些让你觉得相见恨晚的方法、类或接口