C 語言函數參數可為指標,將外部地址傳入函數內部,使函數能操作外部資料,且資料不隨函數結束而銷毀。
錯誤的傳值呼叫:
void swap(int a, int b) { ... } // 僅交換副本,外部無影響
正確的傳址呼叫:
#include <stdio.h>
void swap(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main() {
int a = 66, b = 99;
swap(&a, &b); // 傳遞地址
printf("a = %d, b = %d\n", a, b); // 99, 66
return 0;
}
temp 至關重要,否則 *p1 = *p2 會覆蓋原值導致丟失。
陣列無法整體傳遞,只能傳首元素地址:
int max(int *intArr, int len) {
int maxValue = intArr[0];
for (int i = 1; i < len; i++)
if (maxValue < intArr[i]) maxValue = intArr[i];
return maxValue;
}
int intArr[6] 或 int intArr[] 皆為假象,編譯器仍視為 int *intArr。參數傳遞本質是記憶體拷貝。基本類型僅幾位元組,極快;陣列元素數量不定,拷貝可能極慢。為防止寫出低效程式碼,C 語言在語法層面禁止大塊記憶體直接拷貝。C++、Java、Python 等語言底層同樣採用指標/引用機制避免深拷貝。
#include <stdio.h>
int max(int *intArr, int len) { ... }
int main() {
int nums[6], i, len = sizeof(nums)/sizeof(int);
for (i = 0; i < len; i++) scanf("%d", nums+i); // nums+i 為第 i 元素地址
printf("Max value is %d!\n", max(nums, len));
return 0;
}