46- void*类型的指针可以用来保存任何类型的指针值(即任何类型的指针都可以被赋值给void*类型的指针而无需类型转换)。但是void*类型的指针不能被解引用。
47- 取地址运算符&和指针解引用运算符*,比算术运算符优先级高。不过&*这两个运算符和其他一元运算符混合使用的时候要特别注意。
*ip += 1;
或者
++*ip;
的结果都是ip指向的变量值增加1,但是
*ip++;
就不是。因为*和++的优先级相同,一元运算符的结合性是右结合的,所以上面的表达式实际上是
*(ip++);
48- 如果有
int a[10], *pa=a;
下面的表达式两两等价:
a[i] 和 *(a+i)
&a[i] 和 a+i
pa[i] 和 *(pa+i)
区别在于a不是一个变量,因此任何试图对a做修改的表达式都是非法的,例如
a = pa; a++;
49- 对函数定义的形式参数表来说,char s[]和char *s是等价的。
50- 指针不能当作整数使用,反之亦然。只有数值0例外:可以把0赋值给一个指针变量,也可以把任何指针变量和0进行比较。常量NULL在stdio.h中被定义为代表0的一个符号常量。
51- 求两个指针的差值,结果的类型一般应该用stddef.h中定义的ptrdiff_t。
52- 对指针的下列操作是非法的:
两个指针做加法、乘法、除法
对指针做移位、掩码操作
指针和float, double类型做加法
除了void*类型以外,不加强制转换地把一个类型的指针赋值给另外一个类型的指针。
53- 下面两个定义:
char amsg[] = "now is the time";
char *pmsg = "now is the time";
amsg是数组,其中的字符可以被修改,但是amsg本身的值不能被修改,它一直指向一片固定的内存。pmsg是指针,指向一个字符串常量,p本身的值可以被修改,但是如果试图修改p指向的内存,结果是未定义的。
阅读(1229) | 评论(0) | 转发(0) |