调试及const详细讲解,实例

#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 = &num;
//    *pa = 20;
//    printf("%d\n", num);//打印结果为20
//    return 0;
//}
//改为

    //锁1:::const int num = 10;//const修饰变量为常变量,不能通过num=20;被修改,但是可以通过地址修改,如int* pa = &num;依旧正确
    //锁2:int conts * pa = &num;//const修饰指针变量时,如果放在*左边,修饰的是*p,表示指针指向的内存,不能通过*pa=20;被修改
           //但是锁死的是*pa,而不是pa,还可以给pa赋值,如int n=100;p=&n;还可以给pa赋值,再次修改
    //锁3:int*const pa=&num;//报错的是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;都不能发生

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力成为焦耳定律鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值