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。

推薦閱讀: