//野指针
//int main()
//{
// int a = 10;
// int* p = &a;//给一个明确的地址
//
// int* p2 = NULL;//给P2赋值为空指针
// //*p2 = 200;一旦将指针初始化就不能用这个指针了
// //只要指针是NULL就不能进行访问
// return 0;
//}//局部变量的地址返回就成野指针了
//
//
//
//#define NDEBUG//再头文件前面添加一个NDEBUG就能控制assert的运行,当我们添加了这么一句话,那么assert就无法运行
起到了assert开关的作用,所以assert这个宏失效了
//#include <assert.h>
//
assert()断言,用于在运行程序符合指定条件,如果不符合,就报错终止运行
//int main()
//{
// int* p = NULL;
// //检测有效性
// assert(p != NULL);//如果assert内的内容是真的,那么什么也不会发生的
// //在这里,因为p是空指针,所以与assert内的内容发生矛盾,会发生报错
// //if (p != NULL)//只有在p不为空指针才能被使用
// //{
// // *p=200;
// //}
// return 0;
//}
assert会增加程序运行的时间
assert是用来检测指针的有效性
//strlen是用来统计字符串\0之前的字符的个数
//这个函数是求字符串长度
//参数s指向的字符串不不指望被修改
//所以我们在*左边加上const控制住*s不能被修改
//不加const的话可能会被修改的
//size_t my_strlen(const char* s)//传过来的是数组首元素的地址
//{
// size_t count = 0;
// assert(s != NULL);//如果s为空指针会很可怕,这里我们就要用到assert,保证s不是空指针
// //如果实参传过来的是空指针这里的assert就会报错,告诉我们传来的是空指针
// //检测指针s是否有效
// while (*s)//如果*s检测的不是'\0'的话就持续运行,直到遇到'\0'就停止
// {
// count++;
// s++;//往数组后面走
// }
//}
//int main()
//{
// char arr[] = "abcdef";
// size_t len = my_strlen(arr);
// printf("%zd\n", len);
// return 0;
//}
//
//
//
//传值调用和传址调用
//写一个函数交换两个整型变量的值
/*void swap1(int x, int y)//不许要返回,只要能交换就行了
{
int z = 0;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前a=%d,b=%d\n", a, b);
swap1(a, b);
printf("交换后a=%d,b=%d", a, b);
//交换a和b的值
return 0;
}*/
//输出结果:
//交换前a=3,b=5
//交换后a = 3,b = 5
//可见并没有达到交换的效果
//那么为什么没交换呢?
//通过调试我们可以知道x和y与a,b的地址并不一样,仅仅是拷贝过来的值而已
//当实参传递给形参的时候,形参是实参的一份拷贝,对形参的改变并不会改变实参
//改变思路,将地址传过去,通过地址访问且改变
//void swap1(int*pa, int*pb)//不许要返回,只要能交换就行了
//{
// int z = 0;
// z=*pa;
// *pa = *pb;
// *pb=z;
//
//}
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// printf("交换前a=%d,b=%d\n", a, b);
// swap1(&a, &b);
// printf("交换后a=%d,b=%d", a, b);
// //交换a和b的值
//
//
// return 0;
//}
//输出结果是:
//交换前a=3,b=5
//交换后a = 5,b = 3
祝大家观看愉快,早日成为大牛
标签:return,--,交换,C语言,assert,二刷,int,NULL,指针 From: https://blog.csdn.net/2301_80863610/article/details/139331738