#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//#define NDEBUG
#include<string.h>//strlen求字符串函数
#include<assert.h>//assert断言函数
//指针的使⽤和传址调⽤
//指针使用,strlen的模拟实现
//size_t my_strlen(const char* p)//限制动*p
//{
// size_t cound = 0;
// assert(p != NULL);//判断p不是空地址,在调试时会更加保险稳重
// while (*p)
// {
// cound++;
// p++;
// }
// return cound;
//}
//int main()
//{
// char arr\[\] = "abcdef";
// size_t len = my_strlen(arr);
// printf("%zu\n", len);
// return 0;
//}
////传值调⽤
//void swap1(int a, int b)
//{
// int c = 0;
// c = a;
// a = b;
// b = c;
//}
//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;
//}
//传址调⽤
void swap2(int* const a, int* const b)
{
assert(*a != NULL);
assert(*b != NULL);
int c = 0;
c = *a;
*a = *b;
*b = c;
}
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;
}//总结:传址调⽤,可以让函数和主调函数之间建⽴真正的联系,在函数内部可以修改主调函数中的变量;
//所以未来函数中只是需要主调函数中的变量值来实现计算(如加减法运算)就可以采⽤传值调⽤。
//如果函数内部要修改主调函数中的变量的值,就需要传址调⽤。