[面试题] 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。此号好理解,按位取反