//野指针 //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
祝大家观看愉快,早日成为大牛