标签:
1.不能简单地通过检查一个值的位来判断它的类型,必须要观察程序中这个值的使用方式。
2.指针的初始化是用&操作符完成的,用于产生操作数的内存地址。指针一定要不初始化,不然不能进行解引用。
3.通过一个指针访问它所指向的地址的过程,用 *表示间接访问或者解引用指针。
4.NUll指针,作为一个特殊的指针变量。对一个null指针进行解引用是非法的,故需要提前判断是否是null指针!
5. 指针:int *b = &a; //b为指向整型的指针变量,b=&a ,b指向地址a;*b为地址a的内容。
6.指针的指针:int a=12; int *b=&a; int **c =&b; //操作符自右向左的结合
表达式 | 相当的表达式 |
a | 12 |
b | &a |
*b | a ,12 |
c |
&b |
*c |
b,&a |
**c | *b,a,12 |
7.指针表达式
char ch=‘a‘;
char *cp = &ch;
表达式 | 值 |
*cp++ | 右值为*cp=‘a’,然后cp++(指针增加,指向下一个地址) |
(*cp)++ | 右值为*cp=‘a’,然后‘a’++=‘b’ |
*++cp | 右值为cp++后的值,即cp指针指向的地址的下一个地址的值 |
++*++cp | 右值为cp指针指向的地址的下一个地址的值+1 |
++*cp++ | 右值为=‘a’+1=‘b’,然后cp++(指针增加,指向下一个地址) |
例子:计算字符串长度,查找一组字符串中的某个字符(用到**)。(判断是否是最后一个字符用‘\0’判断)
8.指针运算
算数运算 1. 指针 +/- 整数 (指针每增加1,指针所指向的地址增加1*指针所指向类型的大小。)
2. 指针 - 指针 (只有当两个指针都指向同一个数组中的元素时)
关系运算
(大于、小于,大于等于,小于等于) (前提是指向同一个数组中的元素)
注意:要回辨别指针是否越界,和指向为知值的指针
如下用于清除一个数组中的所有元素
#define N_VALUES 5 float values[N_VALUES]; float *vp; for(vp=&values[0];vp<&values[N_VALUES];){ *vp++=0; }
同上代码功能相同
#define N_VALUES 5 float values[N_VALUES]; float *vp; for(vp=&values[N_VALUES];vp>&values[0];){ *--vp=0; }
以下此种写法错误!!!
#define N_VALUES 5 float values[N_VALUES]; float *vp; for(vp=&values[N_VALUES];vp>=&values[0];vp--){ *vp=0; }
//数组第一个元素被清除后,vp还会执行--操作,这就使vp移到了数组的边界之外。小心!!
标签:
原文地址:http://www.cnblogs.com/doudingbest/p/4486182.html