Skip to main content

27.一节课讲明白c语言指针(下①)

       hello,小伙伴们,大家好,这里是左左右,通过前面几期视频的学习,大家心中可能都有这样一个疑惑,就是总感觉指针有一种多此一举的感觉,那么这期视频我们就通过指针应用的实际案例来帮大家解解心中的疑惑,假如现在有这样一种需求,需要通过调用函数将两个整形变量中的值互换,这里首先定义两个变量,接着我们来定义一个函数,那么如何将两个变量中的值互换呢,这就好比两个杯中分别装有牛奶和可乐,那么如何将牛奶和可乐互换呢,这时我们需要找到一个空杯子,将牛奶杯中的牛奶倒入空杯,接着将可乐杯中的可乐倒入原来装牛奶的杯中,最后将空杯中的牛奶倒入原来装可乐的杯中,这样就完成了牛奶与可乐的互换了,所以照猫画虎来写一下这个函数,首先定义一个变量名为空的变量,将变量a中的值赋值到这个变量,接着将变量b中的值赋值到变量a,最后将空变量中的值赋值到变量b,这样就实现了变量a和b中值的互换,我们调用写好的函数,调试输出看一下结果,这时输出的结果和我们预想的并不一样,变量x和y中值未能实现互换,这是为什么呢?

test.c
#include<stdio.h>
#include<string.h>

void swap(int a,int b)
{
int temp = a;
a = b;
b = a;
}

int main()
{
//通过调用函数将两个整形变量中的值互换
int x = 5,y = 10;
swap(x,y);
printf("x = %d,y = %d",x,y);

return 0;
}

Docusaurus logo        带着这样的疑问重新来写一下刚才的函数,我们将之前的变量a和b改为指针p1和p2,接着将指针中地址对应的值进行互换,这时我们再次调用写好的函数,调试输出看一下结果,这时输出的结果和我们预想的一模一样,变量x和y中值实现互换,那么这两个函数到底有什么样本质的区别呢?

test.c
#include<stdio.h>
#include<string.h>

void swap(int a,int b)
{
int temp = a;
a = b;
b = a;
}

void swap_p(int *p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;

}
int main()
{
//通过调用函数将两个整形变量中的值互换
int x = 5,y = 10;
// swap(x,y);
swap_p(&x,&y);
printf("x = %d,y = %d",x,y);

return 0;
}

Docusaurus logo        通过前面几期指针的学习,我想大家已经有了一个大概的思路了,接着我们通过大家熟悉的动画来分析一下这两个函数的,首先在内存中存入5和10这两个值,这里我们将之前的动画做了简化,接着调用swap这个函数,这里看上去虽然传入的是x,y这两个变量,其实在c语言中,这时传入的只是xy这两个变量中的值,c语言会新建两个变量来存放5和10这两个值,这时互换的只是新建的这两个变量中的值,与x,y这两个变量无关,而且随着函数调用的结束,这两个新建的变量也会消失,这两个变量就是我们常说的局部变量。 Docusaurus logo 空口无凭,我们来验证一下,首先将变量x和y的地址打印输出一下,接着把swap函数中的a和b的地址打印输出来看一下,这时上下两行的输出结果是不一样的,这也就验证了调用swap这个函数传入的参数是变量中的值,如果传入是变量x和y本身,那么上下两行的输出结果就会一模一样的。

test.c
#include<stdio.h>
#include<string.h>

void swap(int a,int b)
{
int temp = a;
a = b;
b = a;
printf("%p,%p\n",&a,&b);
}

void swap_p(int *p1,int *p2)
{
int temp = *p1;
*p1 = *p2;
*p2 = temp;

}
int main()
{
//通过调用函数将两个整形变量中的值互换
int x = 5,y = 10;
swap(x,y);
// swap_p(&x,&y);
// printf("x = %d,y = %d",x,y);
printf("%p,%p\n",&x,&y);


return 0;
}

Docusaurus logo 接下来分析一下带指针的这个函数,调用这个函数是将x的地址传入到指针p1,y的地址传入到指针p2,接着我们通过解引用p1和p2,直接操作变量xy中的值,也就是我们常说的通过庙来找和尚,这时我们不止通过庙找到了和尚,还把庙里的和尚给换了,随着函数调用的结束虽然指针p1和p2也会消失,但这时指针已经完成了他们的使命,已经把变量x和y中值进行了互换。 Docusaurus logo 是不是通过这个案例,我们对指针的应用有了更加深入的了解,希望大家有所收获,好的,今天的视频就到这里了,您的关注,点赞和收藏是我持续更新下去的最大动力,我们下期见