/*
&:取地址运算符
*:指针运算符(或称为间接运算符),取指针所指向的对象的内容
*/
int a,b;
int *pointer_1, *pointer_2;
pointer_1 = &a;//把变量a的地址赋给pointer_1,切记不要将一个整数赋值给指针变量
&*pointer_1;//&和*的优先级相同,但按自右而左的方向结合,次句先执行(*pointer_1)而* pointer_1就是变量a,再执行&运算,故&*pointer_1 和 &a等价,即取变量a的地址
*&a;//先进行&运算得a的地址,再进行*运算,即&a所指向的变量即a,故*&a 和 a 等价
*pointer_1++;//++和*的优先级相同,自右而左结合,故相当于*(pointer_1++),但由于++再pointer_1的右侧,因此先执行*pointer_1得a的值,在将pointer_1++,这样pointer_1就不再指向a了
(*pointer_1)++;//与a++等价
/*********************************************************************/
/*数组与指针*/
int num[10];
int *p;
p = &num[0];//将num[0]元素的地址赋给指针变量p,p指向数组的第0号元素
//c语言规定数组名(不包括形参数组名,形参不占用内存)代表数组中首元素的地址,故以下两
p = &num[0];
p = num;
//语句等价
*p = 1;//在这里将1赋给p当前所指向的数组元素即num[0],值得注意的是赋值前p必须指向一个数组元素
//C中规定指针变量p已经指向数组中的一个元素,则p+1指向同一数组中下一个元素,而不是将p的值简单+1;例如,数组元素是float型,没个元素占4个字节,则p+1意味着p的值(地址)加上4个字节,p+1所代表的地址实际上是p+1*d,d是一个数组元素所占的字节数
//如果p的初值为&num[0],则 p+i和num+i都是num[i]的地址
*(p+i);
*(num+i);
//是p+i或num+i所指向的数组元素即num[i]
/*******************************************************************/
/*总结*/
p++;
p+=1;//使p指向下一元素,即num[1]
*p++;
*(p++);//先得到p指向变量的值即*p,再使p+1=>p
*(++p);//先使p+1=>p,再取*p
++(*p);//表示p指向的元素值+1
//如果p指向num数组中第i个元素;则:
*(p--);
num[i--];//这两语句等价,先对p进行*运算,再使p自减
*(++p);
num[++i];//这两语句等价,先使p自加,再做*运算
*(--p);
a[--i];//这两语句等价,先使p自减,再做*运算