strlen、length、size、sizeof的应用场景

1、区别

  sizeof() 的值在编译时即计算好了,参数可以是指针、数组、类型、对象、函数等。
  sizeof(指针) = 指针大小。
  sizeof(数组名) = 数组占用总空间。
  sizeof(类型) = 类型字节对齐后占用总空间。
  sizeof(函数) = 函数的返回类型所占的空间大小。函数的返回类型不能是void。
strlen() 是函数,其值在运行时计算, 参数必须是字符型指针(char*),该函数实际完成的功能是从代表 该字符串的第一个地址开始遍历,直到遇到结束符’\0’。
strlen(char*)函数求的是字符串的实际长度,返回的长度大小不包括 ‘\0’。


length() 函数用来获取字符串长度。与strlen()不同的是,length()方法并不需要扫描整个字符串,因为string类会保存字符串的长度。

size() 跟length()函数一样,可以获得字符串长度。但是size()函数还可以用来获取vector的长度。

二、分析
1、sizeof() 和 strlen()
1)sizeof(指针)
sizeof(指针) = 指针大小

char a[] = "abcdef";
char* ptr1 = &a;

int b = 10;
int* ptr2 = &b;

### 每行最后的数字表示运行的结果,下文均采用这种方式,不再另外说明 ###
printf("%d\n",sizeof(ptr1)); 8(x64,若是x86下,指针都是4字节)
printf("%d\n",sizeof(ptr2)); 8

2)sizeof(数组名),strlen(数组名)
sizeof(数组名) = 数组占用总空间。
strlen(char*) = 字符串的实际长度,返回的长度大小不包括 ‘\0’。

对于一个数组,其数组名往往代表其首元素首地址,但是当数组名与 sizeof() 一起使用时,数组名代表整个数组。

i、sizeof(整形数组名):
int arr1[5] = {1,2,3,4,5};
int arr2[6] = {1,2,3,4,5};
int arr3[] = {1,2,3,4,5};

printf("%d\n", sizeof(arr1)); 20
printf("%d\n",sizeof(arr2)); 24
printf("%d\n",sizeof(arr3)); 20

接下来逐个分析:

arr1:int arr1[5] = {1,2,3,4,5};
编译时申请了长度为5的数组,每个元素类型为int(4字节),总大小为20字节。

arr2:int arr1[6] = {1,2,3,4,5};
编译时申请了长度为6的数组,每个元素类型为int(4字节),总大小为24字节。但是在内存中只初始化了前五个元素,第六个值为0,见下图:


arr3:int arr3[] = {1,2,3,4,5};
如果定义数组时就给数组中所有元素赋初值,那么就可以不指定数组的长度,因为此时元素的个数已经确定了。花括号中有 5 个数,所以系统会自动定义数组 a 的长度为 5。因此总大小为20字节。

注意1:
这里需要说明一下arr2的第六个值为什么为0:
1、首先,int a[6] = {1,2,3,4,5,6};为 “完全初始化”,这个好理解,申请多少长度,就对全部赋初值。
2、其次,int a[6] = {1,2,3,4,5};为 “不完全初始化”,即只初始化部分值,在C/C++中,没有初始化的值自动为0(只限于整形数组,字符型数组为’\0’,在下文会讲到)。
3、最后,int a[6];为 “完全不初始化”,这种情况下各个元素的值是不确定的,它们取决于数组所在的内存位置上的原始数据。这可能会导致程序出现一些错误和不可预测的结果。比如下图:


注意2:
这里说明三点语法错误:
1、不能写成 int a[5]={}; 如果大括号中什么都不写,那就是极其严重的语法错误。大括号中最少要写一个数。比如 int a[5]={0};这时就是给数组 “清零”,此时数组中每个元素都是零。
2、如果定义的数组的长度比花括号中所提供的初值的个数少,也是语法错误,如 a[2]={1,2,3,4,5};
3、如果定义数组时不初始化,那么省略数组长度就是语法错误。如 int a[];
————————————————

一、length()函数

c++中,length()只是用来获取字符串的长度。

例如:string str = “asdfghjkl”
则,str.length() = 9。

二、size()函数

c++中,在获取字符串长度时,size()函数与length()函数作用相同。
除此之外,size()函数还可以获取vector类型的长度。

例如:vector < int> num(15,2)
则,num.size() = 15。
例如:string str = "d1da";
则, cout<<str.size();

三、sizeof()运算符

sizeof()运算符用来求对象所占内存空间的大小。

char c[] = "asdsds";
char* cc = c;
char cn[40] = "asdsds";
int a[] = {1,2,3,4,5,6};
int* aa = a;
cout << sizeof(c) << sizeof(cc) << sizeof(cc) << sizeof(cn);
cout << sizeof(a) << sizeof(aa) << sizeof(aa);

结果输出:

sizeof(c) = 7 //c是数组,计算到'\0'位置,结果为6 * 1+1=7
sizeof(cc) = 8 //cc为指针类型,大小为8
sizeof(*cc) = 1 //*cc指向c的第一个字符,大小为1
sizeof(cn) = 40 //开辟40个char空间,大小为40 * 1=40
sizeof(a) = 24 //a是数组,但不需计算到'\0',结果为6 * 4=24
sizeof(aa) = 8 //aa为指针类型,大小为8
sizeof(*aa) = 4 //*aa指向a的第一个数字,大小为4
  • 需要注意的是,如果不使用Vector作为数组进行参数传递,那么在传递数组引用是需要再传递一个数组的大小,否则在函数中无法根据首地址计算出数组大小。

四、CPP、java、python获取数组长度的方法

1、CPP
获取字符数组的大小(只能用于获取字符数组长度)
#include
cout<<strlen(a);

注意:获取字符数组长度时,使用strlen(a)和下面将要介绍的sizeof(a) / sizeof(a[0]) 得到的结果略有差别,sizeof(a) / sizeof(a[0]) 会把char数组的’\0’也算入在内。所以得到的大小会比strlen得到的大一。例如:

char a [] = "dadada";
cout<<sizeof(a) / sizeof(a[0]);      //结果为7
cout<<strlen(a);        //结果为6

万能方法

sizeof(a) / sizeof(a[0]) 或者 sizeof(a) / sizeof(* a)

2、Java
注意,java获取数组长度时,length并不是一个方法

a.length

3、Python

len(a)
 sizeof()、strlen()两者区别:

1、sizeof():返回所占总空间的字节数
(1)针对整型或字符型数组
(2)针对整型或字符型指针

2、strlen():返回字符数组或字符串所占的字节数
(1)针对字符数组
(2)针对字符指针

sizeof(…)是运算符,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小

strlen(…)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’。返回的长度大小不包括’\0’

strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个’\0’,如果你只定义没有给它赋初值,这个结果是不定的,它会从aa首地址一直找下去,直到遇到’\0’停止。

二、sizeof()、strlen()两者区别:
1、sizeof是运算符,strlen是函数

2、sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以’’\0’'结尾的

3、大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度。

char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //而b=20;

4、strlen的结果要在运行的时候才能计算出来,用来计算字符串的长度,不是类型占内存的大小

5、sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数

三、length()和size()两者区别:
c++中的size()和length()没有区别

展示
#include<iostream>
#include<cstring>
using namespace std;
int main(){
char str[] = "abcd";
char *arr = "abcd";
string a="abcd";
cout<<" str"<<" a"<<" arr"<<endl;
cout<<"strlen "<<strlen(str)<<" "<<strlen(a.c_str())<<" "<<strlen(arr)<<endl;
cout<<"length "<<" "<<a.length()<<endl;
cout<<"size "<<" "<<a.size()<<endl;
cout<<"sizeof "<<sizeof(str)<<" "<<sizeof(a)<<" "<<sizeof(arr)<<endl;
}

若空着则表示无法用该函数求出长度

 

 

参考:https://blog.csdn.net/Chiang11/article/details/132075874?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_baidulandingword~default-0-132075874-blog-119644082.235^v43^pc_blog_bottom_relevance_base2&spm=1001.2101.3001.4242.1&utm_relevant_index=3

posted @ 2024-02-02 11:56  konglingbin  阅读(184)  评论(0编辑  收藏  举报