C++求數組長度為:
int arr_length = sizeof(arr) / sizeof(arr[0]);
為了友善使用,在C語言中常定義宏來求數組長度
#define ARR_LEN(array, length){ length = sizeof(array) / sizeof(array[0]); }
使用時,直接調用宏函數即可,如
int arr[]={1,2,3,4,5};
int len;
ARR_LEN(arr, len); //此時len指派為5
在C++中,也可以定義模闆函數
template <class T>
int getArrayLen(T &array){
return sizeof(array) / sizeof(array[0]);
}
使用時,調用模闆函數,如
string arr[]={"abc", "ab", "abcde", "1234567", "890"};
int len=getArrayLen(arr); //此時len指派為5
// ************************** 注意!!!!******************************** //
當數組傳入函數時,傳入的是指針,指針僅指向數組頭arr[0],不帶有任何長度資訊,是以在傳入數組時,要把數組長度同時傳入函數。
可以考慮一下,下面這個函數調用時,會輸出什麼?
void length_array(int arr[]){
int len=getArrayLen(arr);
cout<<"len="<<len<<", sizeof(arr)=" << sizeof(arr)<<endl;
}
Output: len=1, sizeof(arr)=4;
這是因為arr是指針,而指針所占空間是4個位元組,是以sizeof(arr)/sizeof(arr[0])=1.
// ****************************************************************************************
請牢記:如果把數組作為參數傳入函數,那麼這個數組會退化為一個指針 int *arr
**************************************************************************************** //
下面說一下size(), length(), strlen()
先說 size() 和 length(),這兩個方法都要先 include <string>,兩者使用起來無任何差别。
即,str.size() == str.length() 為真
引用cplusplus.com中的話:
Both string::size and string::length are synonyms and return the same value, which is the length of the string, in terms of bytes.
而 strlen() 是<cstring>中的,是C語言的遺留物。
引用cplusplus.com中的話:
cstring::strlen returns the length of the C string str. In C++, char_traits::length implements the same behavior.
即 strlen(str) == str.length() == str.size() 為真
#include "iostream"
#include <string>
using namespace std;
int main()
{
int *d = new int[10];
cout << sizeof(d) << endl; // 4 d是我們常說的動态數組,但是他實質上還是一個指針,是以sizeof(d)的值是4。
cout << sizeof(string*) << endl; // 4
cout << sizeof(int*) << endl; // 4
cout << sizeof(char****) << endl; // 4
//可以看到,不管是什麼類型的指針,大小都是4的,因為指針就是32位的實體位址。
// 結論:隻要是指針,大小就是4。(64位機上要變成8也不一定)。
int Array[] = { 1, 2, 3, 4, 5, 6};
int ArrLen = sizeof(Array) / sizeof(Array[0]);
cout << sizeof(Array) << sizeof(Array[0])<< ArrLen << endl; //24 4 6
char aa[] = "abcdef";
cout << sizeof(aa) << sizeof(aa[0]) << sizeof(aa) << endl; //7 1 7
char str[20] = "0123456789";
int a = strlen(str); //a=10;
int b = sizeof(str); //而b=20;
cout << a << b << endl;
string str1 = "hello";
cout << str1.length() << str1.size() << endl; //55
cout << sizeof(str1) << endl;//28
cout << sizeof(string) << endl; //28 無論你的string裡放多長的字元串,它的sizeof()都是固定的,字元串所占的空間是從堆中動态配置設定的,與sizeof()無關。
cout << str1.size() / str1.length() << endl;//傳回位元組數
char* ss1 = "012345678";
cout << sizeof(ss1) << endl;//4
getchar();
return 0;
}
參考文獻及資料
http://www.cplusplus.com
http://blog.csdn.net/bopzhou/article/details/6063163
http://henry-roamer.lofter.com/post/261768_698d3bd