#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> //在某一循环里,想要准确调试某一次,(如500次循环的299次)用 //设置断点+右击鼠标条件i==299+F5 //实例 // 求1!+2!+....+n! //int main() //{ // int n = 0; // scanf("%d", &n);//scanf的%d后面不能加\n // int i = 0; // int ret = 1; // int j = 0; // int sum = 0; // for (j = 1; j <= n; j++) // { // ret = 1; // for (i = 1; i <= j; i++) // { // ret*= i; // } // sum += ret; // } // printf("%d\n", sum); // return 0; //} //for循环 产生1~n的数字 // //for(i=1;i<=n;i++) //{ //ret = *i; 产生的是n的阶乘 //} // //for (j = i; i <= j; j++) //{ // for (i = 1; i <= j; i++) // { // ret = *i; 产生的是1+...+n的阶乘 // } // sum = +ret; //} //int main() //{ // int i = 0; // int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; // for (i = 0; i <= 12; i++) // { // arr[i] = 0; // printf("hehe\n");//hehe可能死循环,因为数组随着下标的增长地址由低到高,,,, // //栈区内存使用时是先高地址后低地址,i = 0; 先被创建(相比于arr[10],在高地址,,,,, // //但是数组arr[10]一直向上非法占用空间(越界),总有一次使用到i的地址,非法修改i的值,使i重新变为0 // //陷入死循环,vs2022没这个可能(因为比较只能,直接报错) // //每个编译器陷入死循环的条件不一样,中间(非法越境)所需要空间不一样 // } // return 0; //} //预防发生错误 //通过编码的技巧,减少.降低错误 //模拟实现strcpy(字符串拷贝) //#include<string.h> //void my_strcpy(char*dest,char*src)//dest和src名字是自己随便起的,对应arr1和arr2的首元素的地址 //{ // while (src != '\n') // { // *dest++ = *src++; // }//没拷贝\0,需要把src的\0也放在dest中,否则dest无法停止(无\0) // *dest = *src; //} //进阶版 //void my_strcpy(char* dest, char* src)//dest和src名字是自己随便起的,对应arr1和arr2的首元素的地址 //{ // while (*dest++ = *src++) // //先引用,后++ src里面的h,解引用并放在dest的第一个地址里,然后++,++后src的第二个e解引用..... // //'\0'的SCII值为0,0为假,不满足while循环,停下来 // { // ; // } //} //再次进阶版(assert考虑空指针的情况) //arr2如果是空指针,空指针不能解引用操作 //#include<assert.h> //void my_strcpy(char* dest, const char* src)//dest和src名字是自己随便起的,对应arr1和arr2的首元素的地址 //{ //const作用:使const后面值不能被修改,修改就报错 // assert(src!=NULL);//断言----如果不满足,报错(错误信息在哪一行) //当判断条件用!!! // assert(dest!= NULL); // while (*dest++ = *src++) // //先引用,后++ src里面的h,解引用并放在dest的第一个地址里,然后++,++后src的第二个e解引用..... // //'\0'的SCII值为0,0为假,不满足while循环,停下来 // { // ; // } //} //int main() //{ // char arr1[20] = "xxxxxxxxxx";//20字符的空间 // char arr2[] = "hello";//5字符的空间 // //strcpy(arr1,arr2);//strcpy(arr1,arr2)是字符串拷贝 // my_strcpy(arr1, arr2);//arr1为起始代码,arr2为源代码 // // printf("%s\n%s\n", arr1,arr2); // return 0; //} //const作用:可以直接报错,不执行 //const作用实例 //int main() //{ // int num = 10; // int* pa = # // *pa = 20; // printf("%d\n", num);//打印结果为20 // return 0; //} //改为 //锁1:::const int num = 10;//const修饰变量为常变量,不能通过num=20;被修改,但是可以通过地址修改,如int* pa = #依旧正确 //锁2:int conts * pa = #//const修饰指针变量时,如果放在*左边,修饰的是*p,表示指针指向的内存,不能通过*pa=20;被修改 //但是锁死的是*pa,而不是pa,还可以给pa赋值,如int n=100;p=&n;还可以给pa赋值,再次修改 //锁3:int*const pa=#//报错的是pa,即pa锁死了,改不了,*pa能被改(修饰指针变量p,表示指针变量不能被改变,但是指针指向的内容可以改变) //右边锁死地址,左边锁死内容 // //int * pa (原来) //int const * pa *pa=0;不能发生 但是pa=&n;n=100;可以发生(通过n改pa,使之改num正确) // int * const pa *pa=0可以发生,但是pa = &n;不能发生(const修饰的是pa本身,不修饰指针*pa,所以不能改num) //int const * const pa *pa=0; pa=&n;都不能发生