分析程序结果,分析过程我们就写在程序注释里面。
写出下列代码的输出内容
#include <stdio.h> int inc(int a) { return (++a); } int multi(int *a, int *b, int *c) { return (*c = *a * *b); } typedef int (FUNC1)(int in); typedef int (FUNC2)(int *, int *, int *); void show(FUNC2 fun, int arg1, int *arg2) { FUNC1 *p = &inc;//p指针指向inc函数 int temp = p(arg1);//调用p后,参数arg1增1返回,下面传进来的参数是10,增1后返回temp=11 fun(&temp, &arg1, arg2);//调用fun位传进来multi,调用multi后,前两个参数指向的整数相乘,结构返回到第三个参数 printf("%d\n", *arg2);//即得到结果为*arg2 = 11*10 =110,所以结果是110 } int main() { int a; show(multi, 10, &a); return 0; }
#include <iostream> #include <string.h> #include <malloc.h> #include <stdio.h> #include <stdlib.h> #include <memory.h> typedef struct AA { int b1 : 5; int b2 : 2; }AA; int main() { AA aa; char cc[100]; strcpy(cc, "0123456789abcdefghijklmnopqrstuvwxyz"); memcpy(&aa, cc, sizeof(AA)); std::cout << aa.b1 << std::endl; std::cout << aa.b2 << std::endl; return 0; } /* AA分别用5位和2位存放b1,b2,不到一个字节 执行完memcpy(&aa, cc, sizeof(AA));后,第一个字节的二进制位 00110000 则可以知道 b1 = 10000 b2 = 001 由于b1,b2都是int类型,默认转换成32位后会进行符号扩展,扩展后的二进制是 111111111111111111111111111 10000 00000000000000000000000000000 001 转换成十进制则分别为 -16 1 所以输出为 -16 1 */
程序输出什么结果:
#include <stdio.h> char *RetMemory() { char p[] = "hellow world"; return p; } void Test() { char *str = NULL; str = RetMemory(); printf(str); } int main() { Test(); return 0; } //输出的内容是不确定的,因为临时变量p之行的内容, //只在RetMemory中有效,返回指针,指针指向的内容是不可预知的
#include <stdio.h> int main() { int arr[] = { 6, 7, 8, 9, 10 }; int *ptr = arr;//初始化ptr指向arr * (ptr++) += 123;//ptr增1后指向7,再之行+=123运算,指向的内容7变为130(这时ptr指针没有变化) printf(" %d %d", *ptr, *(++ptr)); //(参数一般是从右往左入栈,所以先执行右边表达式,ptr指针自增后,指向8) //所以输出结果应该是 8 8 return 0; }
如果有什么问题和疑问可以在下面留言互相探讨。
原题我已经上传到这里了http://download.csdn.net/detail/yincheng01/6461073 ,
解压密码为 c.itcast.cn