[面试题] ios,c

1.main(  )

{ int a[5]={1,2,3,4,5}; 

int *ptr=(int *)(&a+1);  

printf("%d,%d",*(a+1),*(ptr-1));

}

答:2,5

*(a+1 就是a[1] *(ptr-1)就是a[4],执行结果是25 &a+1不是首地址+1系统会认为加一个a数组的偏移是偏移了一个数组的大小本例是5个int int *ptr=(int *)(&a+1); 则ptr实际是&(a[5]),也就是a+5 原因如下 &a是数组指针其类型为 int (*)[5]; 而指针加1要根据指针类型加上一定的值 不同类型的指针+1之后增加的大小不同 a是长度为5的int数组指针所以要加 5*sizeof(int)

所以ptr实际是a[5]

但是prt与(&a+1)类型是不一样的(这点很重要) 所以prt-1只会减去sizeof(int*) a,&a的地址是一样的但意思不一样a是数组首地址也就是a[0]的地址&a是对象数组首地址a+1是数组下一元素的地址即a[1],&a+1是下一个对象的地址即a[5].

2,写一个预处理指令

#define SECONDS_PER_YEAR (60*60*24*365) UL

#define MIN(A,B) ((A)<=(B) ?(A):(B))

3.static 关键字的作用

答: 答:(1)static作用于局部变量,使得局部变量变成局部静态变量,改变了变量的生存期;(2)static作用于全局变量,使其变成静态全局变量,改变变量的作用域,使得其不可扩展声明到别的文件中,只能在本文件中调用;(3)static作用于外部函数,使其成为静态函数,使得函数不能扩展声明到别的文件中,只得 在本文件中调用。

 

6.下面四个用const修饰指针有什么区别(10分)?

const int* p;

int const* p;

int* const p;

const int* const p;

答:前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指 针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改 的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

7. 简述内存分区情况,说明各分区存放的什么样的数据

答:代码区:存放函数二进制代码;

数据区:存放全局变量、静态变量、常量等;

堆区:程序员手动申请的;

栈区:局部变量、函数形参。

8. #include<filename>和#include”filename”有什么区别

答:#include<filename>直接在库文件目录中搜索所包含的文件;#include”filename”先在当前目录下搜索所包含的文件。如果没有的话,再到库文件目录搜索。

9. 写一个函数,交换两个整数,至少使用两种方法

@font-face { font-family: "宋体"; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "Cambria"; }@font-face { font-family: "华文宋体"; }@font-face { font-family: "@华文宋体"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 12pt; font-family: Cambria; }p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph { margin: 0cm 0cm 0.0001pt; text-align: justify; text-indent: 21pt; font-size: 12pt; font-family: Cambria; }.MsoChpDefault { font-family: Cambria; }div.WordSection1 { page: WordSection1; }

答:void Swap(int* _x,int* _y)

{

int nTmp = *_x;

*_x = *_y;

*_y = nTmp;

}

void Swap(int* _x,int* _y)

{

*_x = *_x ^ *_y;

*_y = *_x ^ *_y;

*_x = *_x ^ *_y;

}

 

  表达式10&15表示(1010 & 1111),它将返回表示1010的值10。因为真真得真,或者是11得1,同位全是1结果也是1
   表达式10|15表示(1010 | 1111),它将返回表示1111的值15。假假得假。全零得零。
   表达式10^15表示(1010 ^ 1111), 它将返回表示0101的值5。此时是同性相斥,相同的就为假。
   表达式~10表示(~1010),它将返回表示0101的值 -11。此号好理解,按位取反

 

 

 

 

posted @ 2013-04-25 11:38  金建彤  阅读(209)  评论(0编辑  收藏  举报