指针的使用和传值调用与传址调用

指针的使用

模拟实现strlen

库函数strlen的功能是求字符串长度,统计的是字符串在’\0\之前的字符个数
函数原型如下:

size_t strlen( const char *string );

size_t是strlen的返回类型(无符号整型)。
参数str接收一个字符串的其实地址,如果统计’\0’之前的字符个数,最后返回长度。
如果要模拟实习只要从起始地址依次向后逐个字符的遍历,只要不是’\0’,计数器就+1,一直这样下去,直到遇到’\0’才停止。
参考代码

#include<stdio.h>
#include<assert.h>
//size_t strlen( const char *string );
size_t my_strlen(const char* str)
{
	assert(str != NULL);
	size_t count = 0;
	while (*str != 0)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	size_t ret = my_strlen("Hello World");//"Hello World"的长度为11
	printf("ret = %d\n", ret);
	return 0;
}

运行结果
在这里插入图片描述

传值调用和传址调用

学习指针的目的是用指针解决问题,那有什么问题是非指针不可呢?

例如写一个函数,交换两个整型变量的值

我们经过思考后,可能会写出这样的代码:

#include<stdio.h>
void Swap1(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前 a = %d  b = %d\n", a, b);
	Swap1(a, b);
	printf("交换后 a = %d  b = %d\n", a, b);
	return 0;
}

但结果是怎样的呢,我们运行看看
在这里插入图片描述
我们发现并没有产生交换的效果,这是为什么呢?
我们通过调试来看看原因吧
在这里插入图片描述
我们发现,在main函数内创建了 a 和 b,a的地址是0x0098fea4,b的地址是0x0098fe98,在调用Swap1函数时,我们将a和b传递给了Swap1函数,在Swap1内埔又创建了形参 x 和 y ,来接收 a 和 b 的值,但是 x 的地址和 a 的地址不一样,y 的地址也和 b 的地址不一样,就相当于 x 和 y 是独立的空间,所以在Swap1函数内部交换 x 和 y 的值,是不会影响 a 和 b 的值,当Swap1函数调用结束返回到main函数的时候,a 和 b 自然没有发生交换。
Swap1函数使用的时候,是吧变量本身传递给了函数,这种调用函数的方式叫传值调用。
结论: 实参传递给形参的时候,形参会单独创建一份临时空间来接收实参,对形参的修改并不会影响实参(可以理解为形参是实参的一份临时拷贝)

那我们该怎么办?
我们使用Swap函数,就是为了能操作主调函数(main)中的 a 和 b,可以直接将 a 和 b 的值进行交换。那这就可以使用指针,在主调函数(main)中将 a 和 b 的地址传递给Swap函数,让Swap函数里通过地址来间接的操作主调函数(main)中的 a 和 b,并达到交换的效果

#include<stdio.h>
void Swap2(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("交换前 a = %d  b = %d\n", a, b);
	Swap2(&a, &b);
	printf("交换后 a = %d  b = %d\n", a, b);
	return 0;
}

先看结果
在这里插入图片描述
我们可以看到通过Swap2的函数,顺利完成了任务,这种调用Swap2函数的时候将变量的地址传递给函数,这种调用方式叫:传址调用。
传址调用,是可以让函数和主调函数有真正的联系,可以通过函数内部修改主调函数中的变量。
如果未来的函数只是需要主调函数的变量值来实现计算,就可以使用传值调用
如果未来的函数内部要修改主调函数的变量的值,就需要使用传址调用

结语

感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!

  • 25
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值