聊聊c++數組名稱和sizeof的問題
一維數組名稱的用途:
可以統計整個數組在內存中的長度
可以獲取數組在內存中的首地址
示例:
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 數組名稱內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- C++中獲取字符串長度的函數sizeof()、strlen()、length()、size()詳解和區別(推薦)
- C++中的數組你真的理解瞭嗎
- C++的數據類型你真的瞭解嗎
- 手把手帶你學習C++的數據類型
- C++字符數組、字符數組指針和string類