C语言 指针要注意的一些细节问题

    技术2022-05-20  47

    C语言中NULL的定义形式:#define NULL    ((void *)0)

     

    遇到指针变量与零值比较的问题的时候,你会这么写吗?

    if( p == NULL )

     

    可以,但是不好,这样写会使得编译器不会报错少写一个等号的情况: p=NULL ,也使得该错误难以被发现,不利于程序调试。

    应该这么来写:

    if( NULL == p )

     

    //解释问号处的结果void main( ){ int a[10] = {1,}; int *p = &a[1]; int * r; int i, j; int *q = &a[4]; r = p+2;//? i = q-p;//? j =&a[1]-&a[0];// ?

    }p±n:将指针从当前位置向前(+n)或回退(-n)n个数据单位(指针指向的类型),而不是n个字节.显然,++p/ p++和--p/p-- 是p±n的特例(n=1).p1-p2:两指针之间的数据单位个数,而不是指针的地址数值之差.

     

     

    下列指针运算是否正确?

    char *p,*q,*r;  r = (p + q) / 2;

     

    即使p、q被赋值了,该语句也不能编译通过,也就是说两个指针可以想减得到他们之间所代表的数据单位个数,但是却不能相加!

    可以理解为指针最大为4个字节代表的最大无符号数(因为指针都只占4个字节大小)0xffff,而两个指针相加可能会超出这个值导致溢出!

    所以C语言中是不允许两个指针相加的。

    但是指针可加上一个常数字,它代表从指针当前位置向前移动n个指针代表的数据单位。

     

     

    指针陷阱:

    int main(){ int i = 5; int j = 10; int *p = &i; int result; result = j /*p; return 0;}

     

     result = j /*p;  这条语句中的" /* "会被当做注释符,在编写程序易发现此问题,只需注意。


    最新回复(0)