C語言之數組名與數組起始地址的關系解析
數組名與數組起始地址的關系
void show(int *arr,int len) { cout << "in show(): arr lenth = " << sizeof(arr) << "\n"; for (int i = 0; i < len; ++i) { cout << arr[i] << " "; } cout << "\n"; } int main() { int arr[] = {1,2,3,4,5,6,7}; cout << "in main(): arr lenth = " << sizeof(arr) << "\n"; cout << "in main(): &arr = " << arr << "&arr+1 = "<<&arr+1<<"\n"; show(arr,sizeof(arr)/sizeof(arr[0])); return 0; }
數組名arr表示整個數組的兩種情況
- 在同一作用域下,或者說在同一個函數中,sizeof(arr)表示的是整個數組占用的空間大小;
- 在同一作用域下,或者說在同一個函數中,&arr + 1,表示加整個數組大小。
其餘情況都表示數組的起始地址
數組名作為函數參數傳遞時會退化成一根指針,表示數組的起始地址,大小等於4字節,所以就無法求出數組的長度。
小結:數組作為參數傳遞,除瞭傳遞數組的起始地址,另外一定要傳遞數組的長度,否則可能存在大問題。
數組名為什麼代表首地址
對於一個數組,比如int a[4],它的數組名a代表首地址,這是為什麼呢,看瞭很多解釋,感覺都很扯淡,其實如果我們從匯編的角度來看數組,就非常簡單瞭
數組的0.1.2.3都是偏移地址,而a 就是段地址, 這個段地址的值根 第一個元素的地址是一樣的,所以指向第一個元素,段地址中這跟匯編的尋址方式有 異曲同工的地方,就是這麼簡單,a代表一個首地址,然後加上偏移量就可以定位每個數組的地址。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。