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操作符。 程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。



0 0
原创粉丝点击