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