指针与函数

  • 跨函数间接引用局部变量的一般步骤:
  1. 主调函数中,将变量的地址作为实参 swap(&a,&b);如为数组,写为 fun(&a[0]) 或 fun(a),调用时只需传地址
  2. 被调函数中,定义指针形参 int *p
  3. 被调函数中,对指针形参内容改写完成需求 *p=...;如为数组,写为 *(p+i) =...,可用 p[i] 改写 *(p+i)
  • 何时用普通变量作为形参,何时用指针变量作为形参
  1. 若只需主调函数传给被调函数,用普通变量即可
  2.  若需将被调函数回传主调函数,用指针变量

1. 通过指针变量访问整型变量

#include <stdio.h>
int main()
{
    int a,b;
    int *p1,*p2;
    scanf("a=%d,b=%d",&a,&b);
    p1=&a;
    p2=&b;
    printf("*p1=%d,*p2=%d",*p1,*p2);
    return 0;
}

2.1 输入两个整数,按先大后小的顺序输出。
要求:用指针方法处理。不交换整型变量的值,而是交换两个指针变量的值。
法一:交换引用内容(自定义函数使用该种方法)

#include <stdio.h>
int main()
{
    int a,b,p;
    int *p1,*p2;
    scanf("%d%d",&a,&b);
    p1=&a;
    p2=&b;
    if(a<b)
    {
        p=*p1;
        *p1=*p2;
        *p2=p;
    }
    printf("%d %d",*p1,*p2);
    //printf("%d %d",a,b); 此时引用内容改变,a,b的值改变
    return 0;
}

法二:那交换地址呢?

#include <stdio.h>
int main()
{
    int a,b;
    int *p1,*p2,*p;
    scanf("%d%d",&a,&b);
    p1=&a;
    p2=&b;
    if(a<b)
    {
        p=p1;
        p1=p2;
        p2=p;
    }
    printf("%d %d",*p1,*p2);
    //printf("%d %d",a,b); 此时指针地址改变,a,b的值不变
    return 0;
}

2.2 输入两个整数,按先大后小的顺序输出。
要求:用函数处理,而且用指针类型的数据作函数参数,在函数中通过指针交换两个变量值。

#include <stdio.h>
int main()
{
    void swap(int *p1,int *p2);
    int a,b;
    scanf("%d%d",&a,&b);
    if(a<b)
    {
        swap(&a,&b);//这里传递地址给被调函数
    }
    printf("%d %d",a,b);
    return 0;
}
void swap(int *p1,int *p2)//这里定义指针变量
{
    int tmp;//这里不可定义野指针,来交换地址
    tmp=*p1;
    *p1=*p2;
    *p2=tmp;
}

3. 输入3个整数,按由大到小的顺序输出。
要求:用函数处理,且用指针做函数参数,实现交换两个数。

#include <stdio.h>
int main()
{
    void exchange(int *q1,int *q2,int *q3);
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    if((a<b)||(b<c)||(a<c))
    {
        exchange(&a,&b,&c);//将地址传给被调函数
    }
    printf("%d %d %d",a,b,c);
    return 0;
}
void exchange(int *q1,int *q2,int *q3)//定义指针变量
{
    void swap(int *pt1,int *pt2);
    if(*q1<*q2)
    {
        swap(q1,q2);
    }
    if(*q2<*q3)
    {
        swap(q2,q3);
    }
    if(*q1<*q2)//三个数比较大小,需要两趟;第一趟两次比较,第二趟一次比较
    {
        swap(q1,q2);
    }
}
void swap(int *pt1,int *pt2)
{
    int tmp;
    tmp=*pt1;
    *pt1=*pt2;
    *pt2=tmp;
}

-END

posted @ 2022-10-08 11:49  找回那所有、  阅读(103)  评论(0)    收藏  举报
这里到底了哦~(●'◡'●)