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; 这条语句中的" /* "会被当做注释符,在编写程序易发现此问题,只需注意。