
【計】 array name argument
【計】 array
【化】 array
express; fame; famous; first name; firstname; forename; reputation
【法】 praenomen
become; change
【醫】 meta-; pecilo-; poecil-; poikilo-
basic; buck; chief; dollar; first; Yuan
【經】 dollar; yuan
在計算機編程領域(特别是C/C++語言中),“數組名變元”指将數組名稱作為實際參數(argument)傳遞給函數的行為。此時傳遞的并非整個數組的副本,而是數組首元素的地址(指針),這一過程涉及數組到指針的隱式轉換(稱為“退化”)。以下是關鍵解釋:
數組名的本質
在表達式中,數組名通常代表數組首元素的地址(常量指針)。例如 int arr
中,arr
等價于 &arr
,類型為 int*
(指向整型的指針)。
變元(Argument)的角色
當數組名作為函數參數傳遞時,編譯器将其轉換為指針。函數内部接收的是指針而非完整數組,因此無法直接通過形參獲取數組長度。
來源:Brian Kernighan & Dennis Ritchie, 《The C Programming Language》 5.3節
語法等效性
函數形參聲明以下兩種形式等價:
void func(int *ptr); // 指針形式
void func(int arr[]);// 數組形式(編譯器視為指針)
兩者均接收指針,後者僅為提高可讀性。
來源:ISO/IEC 9899:2018 (C17标準) §6.7.6.3
長度信息丢失
由于傳遞的是指針,函數内無法通過 sizeof(arr)
獲取原數組長度(結果僅為指針大小)。需額外傳遞長度參數:
void process_array(int *arr, size_t len);
數組名作為變元時,發生地址值拷貝。以下代碼演示其行為:
#include <stdio.h>
void check_size(int param[]) {
printf("In function: sizeof(param) = %zu
", sizeof(param)); // 輸出指針大小(如8字節)
}
int main {
int arr;
printf("In main: sizeof(arr) = %zu
", sizeof(arr)); // 輸出數組總大小(如40字節)
check_size(arr); // 傳遞數組名,實際傳遞 arr 的地址
return 0;
}
來源:Stanford CS107課程講義《Arrays and Pointers》
C語言标準文檔
ISO/IEC 9899 标準明确數組到指針的轉換規則(§6.3.2.1)。
ISO C17标準草案 (官方文檔需購買)
經典教材
《C程式設計語言》(K&R)第2版詳細讨論數組與指針的關系(第5章)。
技術社區
Stack Overflow 高票回答解析數組名傳遞機制:
How do I use arrays in C++? (需注意C與C++差異)
void func(int (&arr); // 必須匹配長度為10的整型數組
int arr[]
)。“數組名變元”這一表述需要從編程中的數組名和變元(參數)兩個概念來綜合理解。以下是分點解釋:
數組名的本質
int arr
中,arr
在表達式裡通常被轉換為指向arr
的指針(類型為int*
),但在sizeof(arr)
或&arr
時,它表示整個數組的存儲空間或地址。變元(參數)的定義
void func(int arr[])
等價于void func(int* arr)
。數組名作為變元的行為
sizeof(arr)
獲取原數組長度,需額外傳遞長度參數。示例:
void printArray(int* arr, int size) { // arr是數組名變元,實際為指針
for (int i=0; i<size; i++) {
printf("%d ", arr[i]);
}
}
int main() {
int nums = {1, 2, 3};
printArray(nums, 3); // 數組名nums作為變元傳遞,等效于傳遞&nums
}
數組名作為變元時,本質是傳遞指針,函數通過該指針操作原數組,但需注意數組長度需額外處理。這一機制在C/C++等語言中常見,體現了數組與指針的緊密關聯。
【别人正在浏覽】