C和指针-2


指针

常见错误,使用未初始化的指针

int *a;
...
*a = 12;

NULL指针

NULL指针是一个特殊的指针变量,表示不指向任何东西,要使一个指针变量为NULL,可以给它赋一个零值,为了测试一个指针变量是否为NULL,可以将它与零值进行比较。机器内部而言,NULL指针的值可能与此不同,编译器负责零值和内部值之间的翻译转换。

对一个NULL指针进行解引用操作是非法的。

指针表达式

char ch = 'a';
char *cp = &ch;

|表达式|右值|左值|
|-|-|-|
&ch|变量ch的地址|非法
cp|cp的值|cp所处的内存地址
&cp|指向字符的指针的指针|非法
cp|'a'|ch的内存地址
*cp+1|'a'+ 1 = 'b'|非法
*(cp+1)|cp地址+1位置的值|cp地址+1位置地址
++cp|增值后指针的拷贝|非法
cp++|原来值的拷贝|非法
*++cp|cp+1位置的值|cp+1位置的地址
*cp++|cp所指|cp所指
++
cp|cp所指向位置的值+1|非法
(*cp)++| *cp值|非法

*cp++看上去像线执行间接访问动作,实际上++优先于*操作符
* ++操作符产生cp的一份拷贝
* 然后++操作符增加cp的值
* 在cp的拷贝上执行间接访问操作

指针运算

指针+-整数

指针加上一个整数的结果是另一个指针,如果将一个字符指针加1,运算结果产生的指针指向内中的下一个字符,如果将一个指向 float 的指针加1,将指向下一个 float .当一个指针和一个整数进行算术运算时,整数在执行加法运算前始终会根据合适的大小进行调整。

指针-指针

只有当两个指针都指向同一个数组中的元素时,才允许一个指针减去另一个指针。两指针相减的结果的类型是 ptrdiff_t ,它是一种有符号整数类型,减法运算的结果是两个指针在内存的距离(以数组元素的长度为单位,而不是字节为单位)

关系运算

< > >= <=

前提是他们都指向同一个数组中的元素。

  • 分享:
评论
还没有评论
    发表评论 说点什么