天天看點

C++數組長度

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

繼續閱讀