变量的地址就是变量的指针,存放变量地址的变量就是指针变量.为了表示指针变量和它所指向的变量的关系,用"*"来表示指向.
----------------------------
1>指针的定义
基类型 *指针变量名;
如:int *p;
p: 是指针变量中存放的值,它是一个地址,指向另一个变量的地址.
*P: 是指向变量里存放的值.
&p:是指针变量本身的地址.
注:指针变量必须指定基类型,而一个指针变量只能指向同一个类型的变量.如只有整型变量的地址才或可以放到指向整型的指针中.
------------------------------
2>指针变量的引用
指针变量中只能存放地址,不能将其非地址类型的数据赋给一个指针变量.
*:指针运算符,(或是"间接运算符")
&:取地址运算符
a>运算符"&"只能作用于内存中体现地址的对象,即在内存中为该对象分配存储空间,如变量,数组元素.而&(x+3)和&5则是非法的.
b>取寄存器register变量的地址也是非法的,register变量没有存放在内存中,而是在CPU的寄存器中.没有内存地址.
c>单目运算符*将它的操作数当作为最终目标的地址来对待,并取这个地址里的内容.
----------------------------
指针的应用:
3>指针变量作为函数参数:作用是将一个变量的地址传递到另一个函数中
注意:运算符*和&与!,++,--相同,是自右向左结合.
*p++与(*P)++的比较:
*P++:先作++,再取*,所以先取p的值(一个地址),取*,得这个地址的值,再对p进行++,即下移一 个单位.
(*P)++:括号内的优先级最高,即先取p地址里的值,再将这个值++.p本身不变化.
举例说明:swap(,)几种情况-----交换值
a>最常见的值传递,形参不影响实参的.
swap(int x, int y) { int temp; temp=x; x=y; y=temp}//swap(10,20)还是10,20
swap(int *x, int *y) {int temp; temp =*x; *x=*y;*y=temp}//变换,变成 20,10
swap(int *x, int *y) {int *temp ; *temp=*x;*x=*y;*y=*temp}//变换,变成20,10
swap(int *x,int *y) { int * temp; temp=x; x=y; y=temp}//这个的值没有变化,但x,y指向地址变化
会画如上的内存变化过程.