题目一
ascil码问题
#include "stdio.h" int main() { char a='H'; a=(a>='A'&&a<='Z')?(a+32):a; printf("%c",a); }
总结:C语言唯一一个三目运算符,%c输出格式
题目二
宏定义问题
#include "stdio.h" #define SUB(a) (a)-(a) int main() { int a=2,b=3,c=5,d; d=SUB(a+b)*c; printf("%d\n",d); }
宏定义只是使用宏定义名字代替一个字符串,是一种机械的替换,所以宏替换后的语句为
d=SUB(a+b)*c; 为 d=(a+b)-(a+b)*c;
题目三
if问题
#include "stdio.h" int main() { int x; scanf("%d",&x); if(x<=3); else if(x!=10) printf("%d\n",x); }
关键:if后面有一个;说明如果条件如果成立就直接退出了,else也不会执行。
题目四
关于函数指针变量问题
#include "stdio.h" int add(int a,int b){ return (a+b); } int main(){ int k,(*f)(),a=5,b=10; //int (*f)()为一个函数指针变量,返回值为整数 f=add; k=add(a,b); k=(*f)(a,b); k=f(a,b); k=*f(a,b; //有问题 printf("%d",k); }
关键:int (*f)()为一个函数指针变量,返回值为整形,f为一个指针变量,指向一个已经定义好的函数,在调用该函数的时候需要把参数写在对应的小括号里面,所以k=*f(a,b)调用错误。
题目五
#include "stdio.h" int main(){ char a='5',b; a++; printf("%d,%d\n",a-'5'+255,b=a-'5'); }
关键:ascii码的转换结合%d输出
题目六
双重循环
#include "stdio.h" int main() { char a[4][4]={' '}; int i,j; for(i=0;i<4;i++){ a[i][0]=a[i][3]="#"; for(j=1;j<3;j++){ a[0][j]=a[3][j]='#'; if((i!=0)&&(i!=3)) a[i][j]='o'; } } for(i=1;i<3;i++){ for(j=0;j<4;j++) printf("%2c",a[i][j]); printf("\n"); } }
关键画图,画一个4*4的矩阵,一步一步的画;双重循环,当内部全部循环结束后,外部才循环一轮
题目七
若有定义
typedef int *T[10]; T a;
则以下选项与上述中a的类型完全相同的是()
int *a[10];
关键:题目确实有难度,有知道原因的小伙伴吗,麻烦在评论区留个言鸭
题目八
关于地址的运用
#include "stdio.h" void sp(int* a) { int b=2; a=&b; *a=*a*2; printf("%d,",*a); } int main(){ int k=3,*p=&k; sp(p); printf("%d,%d\n",k,*p); }
关键:在函数里面,函数a得到了b的地址,所以并没有改变k
答案:4,3,3
题目九
二级指针,有点烧脑,但是还是有逻辑关系,解析见注释
#include "stdio.h" int k=7; void f(int** s) { //传进来的r(i的地址的地址) int* t=&k; //t为k的地址 *t=7 *s=t; //把k的地址赋给*s,即*s为k的地址,则**s等于7 printf("%d,%d,%d,",k,*t,**s); //k=7 } int main(){ int i=3,* p=&i,**r=&p; f(r); printf("%d,%d,%d\n",i,*p,**r); //i=3,*r为7的地址,则**r等于7,p=*s,*s=t,*t=7 }
答案:7,7,7,3,7,7
题目十
行指针的运用
#include "stdio.h" int main(){ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},(*p)[4]=a,i,j,k=0; for(i=0;i<3;i++) for(j=0;j<2;j++) k=k+*(*(p+i)+j); printf("%d\n",k); }
关键:(*p)[4]表示一个能存放四个整形元素首地址的一维数组,所以累加的值是 1,3,9,11,17,19