C語言基礎:指針做參數

先來思考這樣一個問題如果有兩個變數需要互換其值,應該如何處理?答案非常簡單:

#include <stdio.h>int main(int argc, char **args){ int i = 3; int j = 5; int t; t = i; i = j; j = t; printf("i = %d
j = %d
", i, j); return 0;}

運行結果:

i = 5j = 3

如果我們有很多組變數都要做值互換,比如100組變數,我們肯定不能寫100次的互換代碼,首先方案就是要編寫一個具有互換功能的函數swap,這個swap函數通過接收參數的方式將變數互換:

#include <stdio.h>void swap(int m, int n){ int t; t = m; m = n; n = t;}int main(int argc, char **args){ int i = 3; int j = 5; swap(i, j); printf("i = %d
j = %d
", i, j); return 0;}

運行結果:

i = 3j = 5

運行結果錯誤,i與j的值並沒有像我們預想的那樣互換。原因是在void swap(int m, int n)中m和n是函數的參數,在main函數執行swap(i, j);時m和n只不過是得到了i和j的值,但m和n並不是i和j本身。當執行m和n互換時,m和n這兩個變數的值的確互換了,但i和j並沒有任何變化。對於整個程序來說i、j、m、n是4個不同的變數,它們之間沒有任何關係。為了解決變數互換的問題,我們需要修改一下代碼,將swap的參數修改為指針參數,修改後的程序如下:

#include <stdio.h>void swap(int *m, int *n){ int t; t = *m; *m = *n; *n = t;}int main(int argc, char **args){ int i = 3; int j = 5; swap(&i, &j); printf("i = %d
j = %d
", i, j); return 0;}

運行結果:

i = 5j = 3

這次的結果是正確的,其實m、n和i、j一樣都是沒有關係的4個變數,但問題的關鍵是m和n都是指針變數,在調用swap函數時將i和j的地址傳入到m和n中,也就是說m的值是i的內存地址,n的值是j的內存地址,在互換代碼中並不是對m和n的值進行互換,而是對*m和*n做互換,也就是對m和n中的地址取變數並做互換操作,受到這個操作影響的就是這個地址中的2個變數i和j。於是i和j的值就互換了。

指針做函數參數的好處很大,它允許在函數內部操作其外部的變數內容。同時,當一個函數的參數是指針變數時我們在編寫程序時要格外的注意,因為在函數內部修改函數外部變數是有一定風險的,要在明確知道函數功能的情況下才能調用這些指針做參數的函數。

再來舉一個指針變數做參數的例子,假設我們要給一個2維數組初始化,這個2維數組有5行10列,下面我們就來實現2個函數,init_array能讓數組裡的所有值都變為指定的數值,show_array能顯示出這個數組:

#include <stdio.h>#define MAX_ROW 5#define MAX_COL 10void init_array(int *p, int val){ for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { *p = val; p++; } }}void show_array(int *p){ for (int i = 0; i < MAX_ROW; i++) { for (int j = 0; j < MAX_COL; j++) { printf("%d ", *p++); } printf("
"); }}int main(int argc, char **args){ int array[5][10]; init_array(array[0], 0); show_array(array[0]); printf("
"); init_array(array[0], 3); show_array(array[0]); printf("
"); init_array(array[0], 7); show_array(array[0]); return 0;}

運行結果:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

歡迎關注公眾號:編程外星人

推薦閱讀:

TAG:編程 | C編程語言 | 編程語言 |