此文章为指针系列的第3篇,如果觉得不错,可关注并收藏,后续会持续更新😜😜😜


目录

在了解这个内容之前,我们先要明白一个非常的重要的知识点,形参和实参

我们来验证实参和形参是不是一个变量

经典程序,通过函数交换两个数的值

方法1:通过中间变量交换

方法2:通过改变形参的指针方向来交换

方法3:通过地址去改变

总结


 

 

在了解这个内容之前,我们先要明白一个非常的重要的知识点,形参和实参

 问题1:形参和实参是什么?

              形参就是我们在定义函数时,小括号中写的参数

              实参是我们调用函数时,传入的参数

              形参和实参的个数必须相同,位置要一一对应,数据类型要兼容

问题2:形参和实参是不是一个变量?

             不是,形参和实参永远不是一个变量


我们来验证实参和形参是不是一个变量

#include <iostream>
#include <stdio.h>
using namespace std;
void test(int i)
{
    i = 99;
    printf("形参i的地址为:%#X\n", &i);
}
int main(int argc, char const *argv[])
{
    int i = 6;
    printf("实参i的地址为%#X\n", &i);
    test(i);
    printf("经过test函数得到的i 为 %d\n", i);
    return 0;
}

c14ca63ab2e74fd2ad2471246ceeaebb.png

i通过函数test之后,i的值并没有发生改变,而且形参i和实参i的地址不同,这更加说明了实参和形参不是一个变量。

经典程序,通过函数交换两个数的值

方法1:通过中间变量交换

void exchange(int a, int b)
{
    
    int t;//定义中间变量
    t = a;
    a = b;
    b = temp;
    
}
int main(int argc, char const *argv[])
{
    int a = 3;
    int b = 5;
    exchange(a, b);
    printf("----------------------\n");
    printf("a=%d\n", a);
    printf("b=%d\n", b);
    return 0;
}

这种方法不行,实参将a=3,b=5传入到形参a,b中,仅仅交换了形参,函数运行完空间释放,实参a和b的值还是原来的值,因为实参和形参不是一个变量

fe8cb86bfe324bbbaa3fb47a8db5caef.png

 

方法2:通过改变形参的指针方向来交换

void exchange_2(int *p, int *q)
{
    int *t;//定义中间指针变量t
    t = p;
    p = q;
    q = t;
}
int main(int argc, char const *argv[])
{
    int a = 3;
    int b = 5;
    exchange_2(&a, &b);//传入a和b的地址
    printf("----------------------\n");
    printf("a=%d\n", a);
    printf("b=%d\n", b);
    return 0;
}

方法2不可以,因为这种方法

虽然传入的是a和b的地址(指针),即p保存了a的地址,q保存b的地址,但是改变的只是p和q的指向

改变前:

fb26374be9f240ffb91e5afb94231adc.png

改变后:

e6a7b9a3285743fc85fd3ff6ec112d38.png

 虽然改变的是p,q的指向,但是我们输出的还是a和b

 方法3:通过地址去改变

void exchange_3(int *p, int *q)
{
    int t;
    //如果要互换*p和*q的值,则t必须定义为int,不能定义成int*,否则语法错误
    t = *p; //p的数据类型是int*,*p的数据类型是int
    *p = *q;
    *q = t;
}
int main(int argc, char const *argv[])
{
    int a = 3;
    int b = 5;
    exchange_3(&a, &b);
    printf("----------------------\n");
    printf("a=%d\n", a);
    printf("b=%d\n", b);
    return 0;
}

方法3可行

传入了a,b的地址,p和q中存放着a,b的地址,*p就是实参a,*q就是实参b,交换*p和*q就等于交换了a和b。换句话说,就是通过地址去找到a和b然后改他们的值。

改变前:

f4320ab5143046a187ec3390796f71b2.png

改变后:

50cef2646d1840f0b9b8f8219d0e1f2d.png

 

总结:


 1.形参和实参永远不会是一个变量

 2.要想通过函数互换两个数的值,就是通过地址去更改。要将要改的数的地址作为参数传入

 3.当写了p = &a; 这句话后,p存放的就是a的地址,*p就是a

 4.更改过后,a,b的地址也不会发生改变

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐