随笔分类 - c
摘要:以下程序的输出是( )[美国某软件公司2009年12月面试题目] 解析:本题定义一个指针指向一个10个int元素的数组。a+1表明a指针向后移动1*sizeof(数组大小);a+1后共向后移动40个字节。*a+1仅针对这一行向后移动4个字节,如下图所示。 答案:输出如下:1 11 2 2 11 一个
阅读全文
摘要:写出函数指针、函数返回指针、const指针、指向const的指针、指向const的const指针。答案: 找出下面程序的错误,并解释它为什么是错的。[中国台湾某著名杀毒软件公司2005年10月面试题] 解析:这道程序体存在着函数指针的错误使用问题。答案:正确的程序如下: 下面的数据声明都代表什么?[
阅读全文
摘要:下列程序会在哪一行崩溃?[美国著名软件企业M公司2007年11月面试题] 解析:int *p=&s.i;相当于int *p; p=&si;。当执行p[0]=4; p[1]=3;的时候,p始终等于&si。s.p=p相当于建立了如下关系:s.p存了p的值,也就是&s.i;s.p[1]相当于*(&s.i+
阅读全文
摘要:写出下面程序的运行结果。[美国著名硬盘公司S 2008年4月面试题] 解析:本题考的是指针与地址的关系问题。本程序结构如下:(1)先声明了一个整型数组a[3],然后分别给数组赋值。(2)又声明了两个整数指针p、q,但是并没有定义这两个指针所指向的地址。(3)使整数指针p的地址指向a(注意a就是a[0
阅读全文
摘要:这个函数有什么问题?该如何修改?[美国著名硬盘公司S 2008年4月面试题] 解析:这个str里存的地址是函数strA栈帧里“hello word ”的首地址。函数调用完成,栈帧恢复到调用strA之前的状态,临时空间被重置,堆栈“回缩”,strA栈帧不再属于应该访问的范围。存于strA栈帧里的“he
阅读全文
摘要:这个程序测试后会有什么结果?[美国某著名计算机嵌入式公司2005年9月面试题] 解析:毛病出在函数GetMemory中。void GetMemory(char *p, int num)中的*p实际上是主函数中str的一个副本,编译器总是要为函数的每个参数制作临时副本。在本例中,p申请了新的内存,只是
阅读全文
摘要:下面5个函数哪个能够成功进行两个数的交换?[中国某互联网公司2009年12月笔试题] 解析:这道题考察函数参数传递、值传递、指针传递(地址传递)、引用传递。swap1传的是值的副本,在函数体内被修改了形参p、q(实际参数a、b的一个拷贝),p、q的值确实交换了,但是它们是局部变量,不会影响到主函数中
阅读全文
摘要:答案:(1)非空区别。在任何情况下都不能使用指向空值的引用。一个引用必须总是指向某些对象。因此如果你使用一个变量并让它指向一个对象,但是该变量在某些时候也可能不指向任何对象,这时你应该把变量声明为指针,因为这样你可以赋空值给该变量。相反,如果变量肯定指向一个对象,例如你的设计不允许变量为空,这时你就
阅读全文
摘要:解析:由以下几个例子我们说明sizeof和strlen之间的区别。第1个例子: sizeof(ss)结果为4,ss是指向字符串常量的字符指针。sizeof(*ss)结果为1,*ss是第一个字符。第2个例子: sizeof(ss)结果为11,ss是数组,计算到“\0”位置,因此是(10+1)。size
阅读全文
摘要:数据对齐,是指数据所在的内存地址必须是该数据长度的整数倍。DWORD数据的内存起始地址能被4除尽,WORD数据的内存起始地址能被2除尽。x86 CPU能直接访问对齐的数据,当它试图访问一个未对齐的数据时,会在内部进行一系列的调整。这些调整对于程序来说是透明的,但是会降低运行速度,所以编译器在编译程序
阅读全文
摘要:解析:ss1是一个字符指针,指针的大小是一个定值,就是4字节,所以sizeof(ss1)是4字节。ss2是一个字符数组,这个数组最初未定大小,由具体填充值来定。填充值是“0123456789”。1个字符所占空间是1字节,10个就是10字节,再加上隐含的“\0”,所以一共是11字节。ss3也是一个字符
阅读全文
摘要:#include #include const int const_global = 0; // 常全局变量 int init_global = 0; // 初始化全局变量 int uninit_global; // 未初始化全局变量 int main (int argc, char* argv[]) { const static int const_static = 0; //...
阅读全文
摘要:在C 中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 一.简介: 1.栈,就是那些由编译器在需要的时候分配,在无需的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程式去控
阅读全文
摘要:/* 234 Press any key to continue */ #include int main() { int i,num = 234,n; char ch,s[10]; for(n = 0; num; ++n) { s[n] = num % 10 + '0'; num /= 10; } s[n] = '\0'; for(i = 0; i < n / 2; ++i) { ch =...
阅读全文
摘要:这是函数指针数组。一层一层向里面剥就好啦。 是一个指向 返回值为void 参数也是void的指针数组。先看里面[50]知道是个数组,再向外看是一个函数指针,合起来就是函数指针数组。我写个源码,你就明白啦。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include
阅读全文