C语言:断言,指针的算数运算

本文探讨了C语言中assert的使用,强调其在调试阶段的重要性,并介绍了如何在不同环境下控制assert的行为。此外,文章详细阐述了指针的算数运算规则,包括指针加减运算的原理和注意事项,以及指针与指针之间的减法运算和间隔计算方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:断言的使用:

assert(断言):断言该结果一定成立。如果表达式为真则忽略,否则终止崩溃。相当于一个if语句:

if(假设成立)
{
     程序正常运行;
}
else
{
     终止程序(避免由程序运行引起更大的错误) 
}

1.断言在debug版本下显示,在release版本下assert自动失效。

2.在调试结束后,可以通过在包含#include 的语句之前插入 #define NDEBUG 来禁用assert调用.

3.应用:

需要引用头文件:#include

例:实现两个数相除(使用断言断定被除数一定不为0

int main( )
{  int a;int b;
    assert(b != 0); //被除数不为0
    if(b == 0)
    {
        return 0;
    }
    else
    {
        return a/b;
    }
}


 

 

二:指针的算数运算:

1.指针加减需要调整,调整的权重为指针本身去掉一个*号,然后求sizeof

如:指针p+-n,实际加的地址为p+-n*(sizeof(*p))

1:求指针加法后的sizeof

int main()
{
    int *p = (int *)100;
    printf("%d\n",p+2);//108.(100+4*2)指针占四个字节
    printf("%d\n",(char **)p+2);//108.去掉一个*类型仍为指针,(100+4*2)
    printf("%d\n",(short *)p+2);//104.(100+2*2)
    printf("%d\n",(long long *)p+2);//116.(100+8*2)
    printf("%d\n",(float *)p+2);//108.(100+4*2)
    printf("%d\n",(double *)p+2);//116.(100+8*2)
    printf("%d\n",(unsigned long)p+2);//102.类型为整形 (100+1*2)
 
    return 0;
}


 

同理:

例2:
int main()
{
    int *p  = (int *)0x2010;
    printf("%x\n",p-2);//2008
    printf("%x\n",(char *)p-2);//200e
    printf("%x\n",(short **)p-2);//2008
    printf("%x\n",(long *)p-2);//2008
    printf("%x\n",(double *)p-2);//2000
    printf("%x\n",(long long)p-2);//200e
 
    return 0;
}


 

2.指针和指针之间不可以相加,但指针和指针之间可进行减运算。

int *p1+int *p2 //error

int*p1 - int*p2 //ok

3. 指针-指针得到之间间隔的单元个数

1)算出间隔的字节数,(2)除以调整的权重

例:

int main()
{
    int arr[10] = {};//x
    int *p = &arr[1];//x+4
    int *q = &arr[9];//x+36
    printf("%d\n",p-q);//-8((4-36)/4)
    printf("%d\n",q-p);//8((36-4)/4)
    printf("%d\n",(char *)q-(char *)p);//32((36-4)/1)
    printf("%d\n",(char ***)q-(char ***)p);//8((36-4)/4)
    printf("%d\n",(double *)q-(double *)p);//4((36-4)/8)
    printf("%d\n",(short *)q-(short *)p);//16 ((36-4)/2)
    printf("%d\n",(int)q-(int)p);//32 ((36-4)/1)
 
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值