指针的使用
模拟实现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函数的时候将变量的地址传递给函数,这种调用方式叫:传址调用。
传址调用,是可以让函数和主调函数有真正的联系,可以通过函数内部修改主调函数中的变量。
如果未来的函数只是需要主调函数的变量值来实现计算,就可以使用传值调用
如果未来的函数内部要修改主调函数的变量的值,就需要使用传址调用
结语
感谢您能阅读完此片文章,如果有任何建议或纠正欢迎在评论区留言。如果您认为这篇文章对您有所收获,点一个小小的赞就是我创作的巨大动力,谢谢!