c语言例题 :输入a和b两个整数,用指针实现从小到大的顺序输出a和b
#include <stdio.h>
int main()
{
int a, b;
int *pa, *pb;
scanf("%d%d", &a, &b);
pa = &a;
pb = &b;
if (*pa > *pb)
{
printf("%d %d\n", b, a);
}
else
{
printf("%d %d\n", a, b);
}
return 0;
}
#include<stdio.h>
int main()
{ int a=0,b=0;
scanf("%d%d",&a,&b);
int* x=&a;//定义指针x指向a
int* y=&b;//定义指针y指向b
if(*x>*y)
{
printf("%d %d",*x,*y);
}
else if(*x<*y)
{
printf("%d %d",*y,*x);
}
return 0;
}
方法一: 利用改变指针变量的值来实现(即改变指针的指向)
#include <stdio.h>
#include <stdlib.h>
/*
输入a和b两个整数,按先大后小的顺序输出a和b;
方法一:利用改变指针变量的值来实现(即改变指针的指向)
*/
int main() {
int *p1,*p2,a,b;
int *temp;
printf("Please enter two numbers:");
scanf("%d %d",&a,&b);//注意在运行时,输入数据的格式要和scanf中的格式相同;
p1=&a;
p2=&b;
if(a<b)
{
temp=p1;
p1=p2;
p2=temp;
}
printf("Max=%d,Min=%d",*p1,*p2);
return 0;
}
方法二: 利用交换指针变量指向的变量值(即交换a和b的值)
#include <stdio.h>
#include <stdlib.h>
/*
方法二:利用交换指针变量指向的变量值(即交换a和b的值)
*/
int main(){
int *p1,*p2,a,b;
int temp;
printf("Please enter two numbers:");
scanf("%d,%d",&a,&b);
p1=&a;
p2=&b;
if(a>b)
{
// *p1和*p2实际就是表示指针变量p1和 p2指向的变量(即a 和 b)
temp=*p1;
*p1=*p2;
*p2=temp;
}
printf("%d %d",a,b);
return 0;
}
方法三: 使用函数处理,将指向两个整型变量的指针变量作为实参传递给swap函数的形参指针变量,在函数中通过指针变量实现交换两个变量的值。
注:
(1)在函数调用时,将实参变量的值传递给形参变量,采取的依然是单向传送的“值传递”方式。(实参—>形参)
(2)不能企图通过改变指针形参的值而改变指针实参的值。因为 C语言中实参变量和形参变量之间的数据传递是单向的"值传递"方式。用指针变量作为函数参数依然要遵循这一规则。
(3)不可能通过执行调用函数来改变实参指针变量的值,但是可以改变实参指针变量所指向变量的值
(1)下面这段代码就是试图通过实参变量的值传入形参变量,然后再改变形参变量的值,然后又传回到实参变量。这显然是无法实现的
int main(){
void swap(int *p1,int *p2);
int *pointer_1,*pointer_2,a,b;
printf("Please enter two numbers:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a>b)
{
swap(pointer_1,pointer_2);
}
printf("%d %d",*pointer_1,*pointer_2);
return 0;
}
void swap(int *p1,int *p2)
{
//交换形参指针变量的值
int *temp;
temp=p1;
p1=p2;
p2=temp;
}
结果并不能实现a和b的值交换,因为改变形参指针变量p1和p2的值并不能改变实参指针变量pointer_1和pointer_2的值。
(2)通过执行调用函数来改变实参指针变量所指向变量的值。(可以实现两个输入的整数按从小到大的顺序输出)
/*
方法三:通过执行调用函数来改变实参指针变量所指向变量的值,从而实现a和b的值交换*/
int main(){
void swap(int *p1,int *p2);
int *pointer_1,*pointer_2,a,b;
printf("Please enter two numbers:");
scanf("%d,%d",&a,&b);
pointer_1=&a;
pointer_2=&b;
if(a>b)
{
swap(pointer_1,pointer_2);
}
printf("%d %d",*pointer_1,*pointer_2);//通过执行调用函数可以实现改变实参指针变量所指向变量的值。
// printf("%d %d",a,b); //两种输出效果一样,因为*pointer_1和a是一个意思
return 0;
}
void swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
注:
函数的调用可以(且只可以)得到一个返回值(即函数值),而使用指针变量作参数,可以得到多个变化了的值。
拓展:
输入3个整数a,b,c, 要求按照从小到大的顺序将它们输出,用函数实现。
#include <stdio.h>
#include <stdlib.h>
/*
输入3个整数a,b,c,要求按照从小到大的顺序输出,利用函数的形式
*/
int main() {
void exchange(int *p1,int *p2,int *p3);
int *pointer_1,*pointer_2,*pointer_3,a,b,c;
printf("Please enter three numbers:");
scanf("%d %d %d",&a,&b,&c);
pointer_1=&a;
pointer_2=&b;
pointer_3=&c;
printf("%d\n",pointer_1);
exchange(pointer_1,pointer_2,pointer_3); //注意:exchange函数中的参数都是指针变量
printf("%d %d %d\n",*pointer_1,*pointer_2,*pointer_3);
printf("%d\n",pointer_1); //可以发现实参指针变量在执行完调用函数后依然没有改变
return 0;
}
void exchange(int *p1,int *p2,int *p3)
{
void swap(int *p_1,int *p_2);
if(*p1>*p2)
swap(p1,p2); //swap函数中的参数是指针变量,但其中交换的是指针变量指向的变量的值
if(*p2>*p3)
swap(p2,p3);
if(*p1>*p3)
swap(p1,p3);
}
void swap(int *p_1,int *p_2)
{
int temp;
temp=*p_1;
*p_1=*p_2;
*p_2=temp;
}
注意:
main函数中的3个实参指针变量的值在执行完调用函数并未改变,这就正好说明前面所说的**“执行完调用函数,并不能改变实参指针变量的值,但是可以改变实参指针变量指向的变量的值”**