首頁 > 軟體

聊聊c++陣列名稱和sizeof的問題

2022-01-23 19:00:33

一維陣列名稱的用途:

可以統計整個陣列在記憶體中的長度

可以獲取陣列在記憶體中的首地址

範例:

int main() {

    //陣列名用途
    //1、可以獲取整個陣列佔用記憶體空間大小
    int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
    cout << "整個陣列所佔記憶體空間為: " << sizeof(arr) << endl;
    cout << "每個元素所佔記憶體空間為: " << sizeof(arr[0]) << endl;
    cout << "陣列的元素個數為: " << sizeof(arr) / sizeof(arr[0]) << endl;
    //2、可以通過陣列名獲取到陣列首地址
    cout << "陣列首地址為: " << (int)arr << endl;
    cout << "陣列中第一個元素地址為: " << (int)&arr[0] << endl;
    cout << "陣列中第二個元素地址為: " << (int)&arr[1] << endl;
    //arr = 100; 錯誤,陣列名是常數,因此不可以賦值
    system("pause");
    return 0;
}

二維陣列陣列名

  • 檢視二維陣列所佔記憶體空間
  • 獲取二維陣列首地址

範例:

int main() {

    //二維陣列陣列名
    int arr[2][3] =
    {
        {1,2,3},
        {4,5,6}
    };
    cout << "二維陣列大小: " << sizeof(arr) << endl;
    cout << "二維陣列一行大小: " << sizeof(arr[0]) << endl;
    cout << "二維陣列元素大小: " << sizeof(arr[0][0]) << endl;
    cout << "二維陣列行數: " << sizeof(arr) / sizeof(arr[0]) << endl;
    cout << "二維陣列列數: " << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
    //地址
    cout << "二維陣列首地址:" << arr << endl;
    cout << "二維陣列第一行地址:" << arr[0] << endl;
    cout << "二維陣列第二行地址:" << arr[1] << endl;
    cout << "二維陣列第一個元素地址:" << &arr[0][0] << endl;
    cout << "二維陣列第二個元素地址:" << &arr[0][1] << endl;
    system("pause");
    return 0;
}

 補充:C++/C中 sizeof(指標)和sizeof(陣列名)的區別

#include <iostream>
using namespace std;

template<class T>
int length(T& data)
{undefined
    return sizeof(data)/sizeof(data[0]);
}
int main(){undefined
int data[]={2,45,7,8,9,23,4,6,7,8,0};
 int data1[12];
 int *data2 = new int[13];
 char *data3 = new char[10];
 cout<<length(data)<<" "<<sizeof(data[0])<<" "<<sizeof(data)<<endl;
 cout<<length(data1)<<" "<<sizeof(data1[0])<<" "<<sizeof(data1)<<endl;
 cout<<length(data2)<<" "<<sizeof(data2[0])<<" "<<sizeof(data2)<<endl;
 cout<<length(data3)<<" "<<sizeof(data3[0])<<" "<<sizeof(data3)<<endl;
 return 0;

執行結果截圖可知:

sizeof()引數為陣列名和指標變數的不同,sizeof(data)=44 此處為確為陣列長度。
sizeof(data2)=4此處與sizeof(data2[0])相同,但是意義卻不同。
sizeof(data2)=4得到的結果永遠是指標變數本身的大小,此處是一個指標變數,指標變數永遠為32位元4位元組,只要是指標,大小就是4(64位元機上要變成8也不一定);當宣告動態陣列時一定要小心。
sizeof(data2[0])=4指標變數指向的空間的大小,此處為陣列空間為int型別,類似於sizeof(int)=4,而sizeof(data3[0])=1,就類似於sizeof(char)=1。

提到了sizeof,那什麼是sizeof?

首先看一下sizeof在msdn上的定義:
  The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
  看到return這個字眼,是不是想到了函數?錯了,sizeof不是一個函數,你見過給一個函數傳引數,而不加括號的嗎?sizeof可以,所以sizeof不是函數。網上有人說sizeof是一元操作符,但是我並不這麼認為,因為sizeof更像一個特殊的宏,它是在編譯階段求值的。
  結論:不要把sizeof當成函數,也不要看作一元操作符,把他當成一個特殊的編譯預處理。

小尾巴~~~~~~~~~~~~     

       為什麼要寫sizeof()呢?起初是想寫寫排序演演算法,想把陣列當作引數傳入,然後用length算出陣列長度,但是失敗了,查閱資料後發現,大部分的函數如果想要傳引陣列,需要多傳一個引數即陣列長度。用上邊length的方法行不通,只是傳入了一個指標而已。

到此這篇關於c++陣列名稱和sizeof的文章就介紹到這了,更多相關c++ sizeof 陣列名稱內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com