首先看以下程序:
例 23.1. 指針參數和返回值
#include <stdio.h>
int *swap(int *px, int *py)
{
int temp;
temp = *px;
*px = *py;
*py = temp;
return px;
}
int main(void)
{
int i = 10, j = 20;
int *p = swap(&i, &j);
printf("now i=%d j=%d *p=%d\n", i, j, *p);
return 0;
}我們知道,調用函數的傳參過程相當於用實參定義並初始化形參,swap(&i, &j)這個調用相當於:
int *px = &i; int *py = &j;
所以px和py分別指向main函數的局部變數i和j,在swap函數中讀寫*px和*py其實是讀寫main函數的i和j。儘管在swap函數的作用域中訪問不到i和j這兩個變數名,卻可以通過地址訪問它們,最終swap函數將i和j的值做了交換。
上面的例子還演示了函數返回值是指針的情況,return px;語句相當於定義了一個臨時變數並用px初始化:
int *tmp = px;
然後臨時變數tmp的值成為表達式swap(&i, &j)的值,然後在main函數中又把這個值賦給了p,相當於:
int *p = tmp;
最後的結果是swap函數的px指向哪就讓main函數的p指向哪。我們知道px指向i,所以p也指向i。
1、對照本節的描述,像圖 23.1 “指針的基本概念”那樣畫圖理解函數的調用和返回過程。在下一章我們會看到更複雜的參數和返回值形式,在初學階段對每個程序都要畫圖理解它的運行過程,只要基本概念清晰,無論多複雜的形式都應該能正確分析。
2、現在回頭看第 3 節 “形參和實參”的習題1,那個程序應該怎麼改?