例子1.
void fun (int *x , int *y) {
printf("%d, %d", *x, *y) ; *x = 3; *y = 4;}main()
{ int x = 1, y = 2 fun(&y, &x); printf("%d, %d", x, y);} 结果2, 14, 3注意main在调用fun函数时, y 和x故意写颠倒了。
--------------------------------------------------------------
例子2.
#include <stdio.h>
void swap(int *p1, int *p2){ int temp; temp = *p1; *p1 = *p2; *p2 = temp;}main()
{ int a, b; int * p1 = &a, *p2 = &b; scanf(%d %d, p1, p2); swap(p1, p2); prinf("%d, %d", *p1, *p2);}如果在控制台输入 2 和 5
则输出结果为
5, 2
原因: 在调用swap函数时使用了职称,所以在swap函数内部对p1,p2 所引用的内容值的修改,会影响外面的a和b的值。
--------------------------------------------------------------
例子3:
#include <stdio.h>
void swap(int *p1, int *p2){ int *temp; temp = p1; p1 = p2; p2 = temp;}main()
{ int a, b; int * p1 = &a, *p2 = &b; scanf(%d %d, p1, p2); swap(p1, p2); prinf("%d, %d", *p1, *p2);}和2不同, swap函数中的temp为指针,temp=p1使得temp指向了2,p1=p2使得p1指向了5,p2=temp使得p2指向了5.
但最后的打印结果仍为
2,5 原因是:虽然main中调用swap函数时使用了指针传递,但swap函数中的所有操作都是:将指针本身的修改,而没有再次使用*操作符来修改“指针指向的内容值”---------------------------------------------------------------------
例子4:
#include <stdio.h>
void swap(int *p1, int *p2){ int *temp; *temp = *p1; *p1 = *p2; *p2 = *temp;}main()
{ int a, b; int * p1 = &a, *p2 = &b; scanf(%d %d, p1, p2); swap(p1, p2); prinf("%d, %d", *p1, *p2);}和2很像。但唯一不同是,temp定义为指针而不是普通变量。看上去似乎应该和2的输出结果一样,仍为
2,5 。但实际运行时编译器会报错:非法的内存写入。
原因是:temp为野指针,并没有预订指向哪里。如果指向系统区,则可能导致操作系统死机。
如果temp在定义后,马上给一个初始值,就不会有问题了。