求数组长度

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;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值