例子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, 1
4, 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在定義後,馬上給一個初始值,就不會有問題了。