1、“指针”和“指针变量”概念
指针是一个地址,而指针变量是存放地址的变量。
2、 数组名不代表整个数组的,只代表数组首元素的地址。
3、 两个指针相减,如P1-P2,只有两个指针P1和P2都指向同一个数组中的元素时才有意义。
4、 执行P+1时并不是将P的值(地址)简单的加1,而是加上一个数组元素所占用的字节数。
5、 如果指针变量P1和P2都指向同一数组,如执行P2-P1,结果是P2-P1的值(两个地址之差)除以数组元素
的长度,这个结果是有意义的,表示P2所指的元素与P1所指的元素之间差两个元素,两个地址不能相加,
如P1+P2没有任何 的实际意义。
6、 一个实参数组,要想在函数中改变次数组中的元素的值,实参与形参的4中对应关系:
第一:形参和实参都用数组名。
第二:实参用数组名,形参用指针变量。
第三:实参形参都用指针变量。
第四:实参为指针变量,形参为数组名(编译系统把x作为指针变量来处理)
7、 如何用指针变量作实参,必须先使指针变量有确定的值,指向一个已定义的对象。
8、通过两个函数对比结果:
#include<stdio.h> void main() { void swap(int *x, int *y); int a=1,b=2,*pin1,*pin2; pin1=&a; pin2=&b; if(a<b) { swap(pin1,pin2); } printf("%d\n%d\n",a,b); } void swap(int *x,int *y) { int temp; temp=*x; *x=*y; *y=temp; }
上面函数的运行结果为2 1,此时形参为指针变量,通过调用指针变量的方式改变a,b的值,函数运行完之后a,b值发生变化并保持下来。但是如果我们通过下面函数的形式来改变a,b的值,结果是不对的。
#include<stdio.h> void main() { void swap(int x, int y); int a=1,b=2; if(a<b) { swap(a,b); } printf("%d\n%d\n",a,b); } void swap(int x,int y) { int temp; temp=x; x=y; y=temp; }
此时运行结果为1,2,可以看到a,b的值并没有发生调换。所以此种使用形参的方式是错误的。也就是说为了使在函数中改变了的变量值能被主调函数Main所用,不能采取上述吧要改变的变量作为形参的办法,而应该用指针变量作为函数参数,在函数过程中使指针变量所指向的变量值发生变化。当函数结束后,这些变量值的变化依然保留下来。