期末考试要考C语言,边复习边写博客,总结了一些自己不太明白或者可能出错的知识点。现自己已经弄明白,写的你们肯定也能明白,希望期末备考的同学们不挂科,也适合自学C语言的小白哦
这篇博客主要写指针,由易到难,会了指针,前面的例题也就都会了。
- 对三个数进行大小排序
# include <stdio.h>
int swap(int *p,int *q);
int main(){
int a=5, b=11, c=9;
int *p1=&a,*p2=&b,*p3=&c;
printf("%d %d %d\n",a,b,c);
printf("%d %d %d\n",p1,p2,p3);
if (a>b){
swap(p1,p2);
}
if(a>c){
swap(p1,p3);
}
if (b>c){
swap(p2,p3);
}
printf("%d %d %d\n",a,b,c);
printf("%d %d %d\n",p1,p2,p3);
}
int swap(int *p,int *q){
int o;
o = *p;
*p = *q;
*q = o;}
5 11 9
6487556 6487552 6487548
5 9 11
6487556 6487552 6487548
这个swap函数必须用指针写,如果这样,两个数在函数内是交换了,但没有返回主函数,所以必须用指针写,由结果可以看出,函数交换了指针上存放的数值,指针本身并没有变。
int swap(int p,int q){
int o;
o = p;
p = q;
q = o;
}
- 对10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换
# include <stdio.h>
int swap(int *p,int *q);
int main( ){
int a[10]={11,5,8,7,6,9,0,3,4,2} ,*min,*max,*p;
max=min=a;
p=a;
for (;p<a+10;p++){
if (*max<*p)
max=p;
}
swap(a+9,max);
for (p=a;p<a+10;p++){
if(*min>*p)
min=p;
}
swap(a,min);
for (p=a;p<a+10;p++)
printf("%d ",*p);
}
int swap(int *p,int *q){
int o;
o = *p;
*p = *q;
*q = o;
}
本题的主要思路就是先让max和min都等于第一个值的地址,让其与后面的每一个值的地址进行比较,(注意这里是指针的大小比较)如果min比后面的某个值x大,就把x的地址赋值给min,若还有个y比x还小,就把y的地址再赋值给min,直到找到最小的值。注意这时并没有进行数值交换,只是min这个指针指向了不同的数值,下面的swap函数才让其交换了地址所存放的数值。max是一样的。
有的同学可能会想到,用一个for循环,直接找出最大和最小的值不就行吗。不行!
因为这里有个bug如果a=>第一个数是最大的,b=>最后一个数为最小的,a||b 之能交换一个最值,a&b直接不交换。要是非得用也行, 看老谭怎么写的吧
- 有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
# include <stdio.h>
int main(){
int i, k, m, n, num[50], *p;
printf("input number of person: n=" );
scanf("%d", &n);
p=num;
for(i=0;i<n;i++) //给人数编号
*(p+i)=i+1;
i=0; //i为每次循环时计数变量
k=0; //k为按1 2 3报数的计数变量
m=0; //m 是出局的人数
while(m<n-1){ //m 是出局的人数,因有n个人,最后剩一个人,最多出局(n-1)个人
if( *(p+i) != 0) //判断这个序号(原来的序号)是否出局
k++; //如果这个号没有出局,就报数,计数器加1,要是出局了就不算这个号了
if(k==3){ //报3的出局
*(p+i)=0; //将出局的这个人标记为0
k=0; //使计数器置零,重新数1 2 3
m++; //出局人数计数器加1
}
i++; //将指针后移,虽然i不是指针,但p+i就是指针了,i为指针服务
if(i==n) //如果指针移到了尾部,则返回到头部
i=0; //因为编号是从1开始的,所以i=0,以确保下一个是开头
}
int a=0;
for(i=0;i<n;i++){ //因为报到3的就设置成0了,所以加起来就是最后那个序号
a+=num[i];
}
printf("最后一个是%d ",a);
}