Skip to main content

28.一节课讲明白c语言指针(下②)

hello,小伙伴们,大家好,这里是左左右,这期视频我们接着讲指针的应用,前面视频我们写过一个通过直径计算半径的函数,快速的来写一下,打印输出来看一下结果是不是没有问题?接着我们用指针的形式来重新写一下这个函数,打印输出来看一下结果是不是也没有问题?

test.c
#include<stdio.h>
#include<string.h>
int Get_r(int d)
{
return d/2;
}
int Get_rp(int *dp)
{
return *dp/2;
}
int main()
{
int d1 = 10;
int r1;
// r1 = Get_r(d1);
r1 = Get_rp(&d1);
printf("当圆的直径为%d时,半径为:%d",d1,r1);
return 0;
}

Docusaurus logo 通过上期视频的学习我们知道第一种函数的写法,它是新建了一个局部变量用来存放变量d1中的值,也就是说在函数中我们改变变量的值也只是改变局部变量中的值,对d1本身是没有任何影响的,接着我们写代码来验证一下,点击运行,d1的值是没有发生任何变化,接着我们来看第二种写法,通过上期视频的学习我们知道指针是通过地址来直接操作变量d1中的值,我们写代码来验证一下,点击运行,d1的值是不是发生了改变?

test.c
#include<stdio.h>
#include<string.h>
int Get_r(int d)
{
d = 20;
return d/2;
}
int Get_rp(int *dp)
{
return *dp/2;
}
int main()
{
int d1 = 10;
int r1;
r1 = Get_r(d1);
// r1 = Get_rp(&d1);
printf("当圆的直径为%d时,半径为:%d",d1,r1);
return 0;
}

Docusaurus logo 第二种写法省去了再次定义一个新的局部变量,而是通过指针的形式直接操作变量d1,这样就提高了代码执行的效率,但是第二种写法存在一个什么样的问题呢?由于它是通过地址来直接操作变量d1的,他会导致d1本身的值发生变化,当其他函数使用d1时,这时d1中的值就是20了,而不是10了,这样就很混乱了。

test.c
#include<stdio.h>
#include<string.h>
int Get_r(int d)
{
d = 20;
return d/2;
}
int Get_rp(int *dp)
{
return *dp/2;
}
int main()
{
int d1 = 10;
int r1;
r1 = Get_r(d1);
// r1 = Get_rp(&d1);
printf("当圆的直径为%d时,半径为:%d",d1,r1);
return 0;
}

Docusaurus logo 为了防止这种情况的发生,我们经常在指针前面加一个const的关键词,这时在函数中改变指针对应地址中的值时就会报错。

test.c
#include<stdio.h>
#include<string.h>
int Get_r(int d)
{
d = 20;
return d/2;
}
int Get_rp(const int *dp)
{
*dp = 20
return *dp/2;
}
int main()
{
int d1 = 10;
int r1;
r1 = Get_r(d1);
// r1 = Get_rp(&d1);
printf("当圆的直径为%d时,半径为:%d",d1,r1);
return 0;
}

通过前面几期视频的学习我们知道,函数是可以通过return来产生一个返回值的,但是如果我们需要多个返回值应该怎么办呢?假设我们现在有这样一个需求,通过调用函数返回圆的半径,周长和面积,首先我们在主函数中定义变量c和s分别代表周长和面积并初始化,由于周长和面积是存在小数点的,所以数据类型选择float,接着我们把浮点型变量c和s的地址传入函数,由于传参传入的是地址,所以我们在函数这里定义指针cp和sp,接着给指针cp对应地址中的值赋值,也就是给变量c赋值,然后给指针sp对应地址中的值赋值,也就是给变量s赋值,这里我们就通过指针的形式直接改变了变量c和s中值,也就实现了一个函数有多个返回值的效果了,点击运行,输出的正是我们想要的结果。

test.c
#include<stdio.h>
#include<string.h>
int Get_r(int d)
{
d = 20;
return d/2;
}
int Get_rp(const int *dp,float *cp,float *sp)
{
*cp = *dp*3.14;
*sp = (*dp/2)*(*dp/2)*3.14;
return *dp/2;
}
int main()
{
int d1 = 10;
int r1;
//通过调用函数返回圆的半径,周长和面积
float c = 0;
float s = 0;
r1 = Get_rp(&d1,&c,&s);
printf("当圆的直径为%d时,半径为:%d,周长为:%f,面积是:%f",d1,r1,c,s);
return 0;
}

Docusaurus logo 通过这个案例我们得到这样一个结论,就是说我们不想改变变量本身的值时,就在前面加一个const的关键词,当想要改变的变量本身的值时,就不需要const这个关键词,c语言基础的讲解暂时也就告一段落了,后面如果有大的c语言知识点,我仍然也会单独拿出来给大家进行讲解,好的,今天的视频就到这里了,您的关注,点赞和收藏是我持续更新下去的最大动力,我们下期见。