一:断言的使用:
assert(断言):断言该结果一定成立。如果表达式为真则忽略,否则终止崩溃。相当于一个if语句:
if(假设成立)
{
程序正常运行;
}
else
{
终止程序(避免由程序运行引起更大的错误)
}
1.断言在debug版本下显示,在release版本下assert自动失效。
2.在调试结束后,可以通过在包含#include
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;
}