今天上班,事情不是很多了,就在网上看到几个c语言的测试题,感觉有点意思,就拿来分析下,我在VS2008下编译验证了
想大概写下解释,都是自己的理解,希望大家指正,因为我也不太会
第1题:
#include<stdio.h>
main()
{
struct node{int a;int b;int c;};
struct node s={5,7,9};
struct node *pt=&s;
printf("%d",*pt);
}
这个主要考察,结构体指针,我只认识那个取地址的符号&,将指针pt指向结构体 s 的首地址,打印时,只打印1个整型数,所以就输出 5 了
如果打印语句换为printf("%d %d",*pt);打印结果就是 5 7了,之后大家就懂了吧
第2题:
#include<stdio.h>
main()
{
char p;
char buf[10]={1,2,3,4,5,6,8,9};
p=(buf+1)[5];
printf("%d",p);
}
这里主要是考察这里p=(buf+1)[5];我之前从未见过这种用法,这次验证了下,猜了下他的作用,不知道是否是自己理解的
输出结果:8,p=(buf+1)[5]; 换为p=(buf-1)[5];输出 5 ,大家也懂了吧,前面括号里 加减 多少就相当于在 [ ]里面对5 加减多少
我也不清楚为什么要这样做
第3题
#include<stdio.h>
int counter(int i)
{
static int count=0;
count=count+i;
return count;
}
main()
{
int i,j;
for(i=0;i<=5;i++)
j=counter(i);
printf("%d",j);
}
这段程序的输出:15
这里就是考察static的作用,static int count=0; 换成int count=0; 输出结果就是 5
通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。
第4题
#include<stdio.h>
void f(char **);
main()
{
char *argv[]={"ab","cd","ef","gh","ij","kl"};
f(argv);
}
void f(char **p)
{
char *t;
t=(p+=sizeof(int))[-1];
printf("%s",t);
}
这段程序的输出:gh 其实这道题和 第2题是一样的 sizeof(int)=4 最后输出 t=(p+4)[-1]=p[-1+4]=p[3]
第5题
#include<stdio.h>
void foo(int [][3]);
main()
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
foo(a);
printf("%d",a[2][1]);
}
void foo(int b[][3])
{
++b;
b[1][1]=9;
}
这段程序的输出:9
执行完 foo(a); 打印a={{1,2,3},{4,5,6},{7,9,9}}; 本来是 b[1][1]=9,结果行数被加1,变为b[2][1]=9;
如果将 ++b; 改为 --b; a={{1,9,3},{4,5,6},{7,8,9}}; 本来是 b[1][1]=9,结果行数被减1,变为b[0][1]=9;
如果删掉 ++b; a={{1,2,3},{4,9,6},{7,8,9}}; 本来是 b[1][1]=9
二维数组就是数组的数组,a[3][3]就是 a包含 3个 int型的 3个数组的数组
至于为什么这样加减,我也不清楚,为什么这样玩,有知道的可以告诉我啊,谢谢了!