一、算术运算:
1、指针与证书的加减运算:(px+n,px-n)
指针作为地址量加上或减去一个整数n,其意义是指针当前指向位置的前方或后方第n个数据的位置。由于指针可以指向不同数据类型,即数据长度不同的数据,所以这种运算的结果取决于指针指向的数据类型。
例如:当字符指针加1,实际结果是指针中的地址值加1;整数指针加1,实际结果是指针中的地址值加2;
* p+n的实际操作是:(p)+n*sizeof(数据类型);
* p-n的实际操作是:(p)-n*sizeof(数据类型);
2、指针加1、减1运算:(px++,++px,px--,--px)
具有1中的计算特点,例如: y=*px++;
该表达式中有三种运算:=、*和++。 *和++优先于=。 *和++属于同级运算,其结合规则是从右至左。所以++运算是对px进行的。相当于 y=*(px++);
这里的px++是后置运算。因此该表达式的运算顺序是:访问px当前值指向的目标,把目标变量的值赋予y,然后px加1指向下一个目标。
3、指针的相减运算:(px-py)
如果两个指针px和py所指向的变量类型相同,则可以对他们进行相减运算。结果是两指针指向的地址位置之间的数据个数。实际上就是地址计算。所以两指针相减的结果值不是地址量,而是一个整数。
二、关系运算:
数据在内存中的存储逻辑是由前向后,那么指向后方的指针大于指向前方的指针。
三、赋值运算:
1、把一个变量的地址赋予一个指向相同数据类型的指针,例如:char a,*p; p=&a;
2、把一个指针的值赋予相同数据类型的另外一个指针,例如: int *p,*q; p=q;
3、把数组的地址赋予指向相同数据类型的指针。例如: char a[10], *pa; pa=a;
另:指针赋值区别,如果一开始只是定义,后面赋值,则是如下形式:
char a, *p; p=&a;
如果在一开始定义的时候就赋值,则是如下形式:
int a, *p=&a;
于是也可以理解了这种形式:
int n; int *p1=&n; int *p2=p1; 因为p1只是在定义赋值的时候才是*p1=&n,如果在不是定义的时候用到p1,则p1就是代表&n,不用写成*p1;
于是上面的形式等价于:int n; int *p1=&n; int *p2=&n;