sizeof与strlen比较

sizeof定义sizeof是C/C++中的一个操作符(operator),简单的说其作用就是返回一个对象或者类型所占的内存字节数。

strlen定义:strlen(char*)是一个函数,求的是字符串的实际长度,直到遇到第一个'\0',然后就返回计数值,且不包括'\0'。

传给strlen(char*)的实参必须是字符串指针或者数组名;当给sizeof传递字符串指针时sizeof(p)结果是字符串指针所占的内存字节数,不是字符串所占内存的字节数,要计算数组所占内存字节数时必须给sizeof传递数组名,sizeof求字符串的长度时结果包括'\0'在内

sizeof:

C语言中判断数据类型或者表达式长度符;不是一个函数,字节数的计算在程序编译时进行,而不是在程序执行的过程中才计算出来

格式:

sizeof(类型说明符,数组名或表达式);
  或sizeof 变量名

其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为

1
typedef  unsigned  int  size_t ;

指针变量的sizeof
学过数据结构的你应该知道 指针 是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部 地址总线 的宽度。所以在32位计算机中,一个 指针变量 的返回值必定是4(注意结果是以 字节 为单位),但是,在 64位 系统中指针变量的sizeof结果为8。
1
2
3
4
5
6
7
8
9
10
char *pc= "abc" ;
int *pi;
string*ps;
char **ppc=&pc;
void (*pf)(); //函数指针
sizeof (pc); //结果为4
sizeof (pi); //结果为4
sizeof (ps); //结果为4
sizeof (ppc); //结果为4
sizeof (pf); //结果为4
指针变量的sizeof值与指针所指的对象没有任何关系,其值是指针变量本身所占内存字节数;
数组的sizeof
数组的sizeof值等于数组所占用的内存字节数,如:
char a1[] = "abc"; int a2[3]; sizeof( a1 ); // 结果为4,字符末尾还存在一个NULL终止符 sizeof( a2 ); // 结果为3*4=12(依赖于int)
一些朋友刚开始时把sizeof当作了求 数组元素的个数,如今你应该知道这是不对的,那么应该怎么求数组元素的个数呢Easy,通常有下面两种写法:
1
2
intc1= sizeof (a1)/ sizeof ( char ); //总长度/单个元素的长度  char型
intc2= sizeof (a2)/ sizeof (a2[0]); //总长度/第一个元素的长度 int型
写到这里,提一问,下面的c3,c4值应该是多少呢
1
2
3
4
5
6
7
8
voidfoo3(chara3[3])
{
intc3= sizeof (a3); //c3==
}
voidfoo4(chara4[])
{
intc4= sizeof (a4); //c4==
}
也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是 数组类型,而是蜕变成 指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo3时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将 实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。
结构体的sizeof
这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个 结构体
1
structS1{charc;inti;};
问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗?你在你机器上试过了吗?也许你是对的,但很可能你是错的!这与机器的对齐方式有关系,VC6中按默认设置得到的结果为8。
与strlen区别
strlen(char*)函数求的是字符串的实际长度,直到遇到第一个'\0',然后就返回计数值,且不包括'\0'。
char aa[10];cout<<strlen(aa)<<endl; //结果是不定的,因为未初始化,'\0'在内存中的位置不确定
char aa[10]={'\0'}; cout<<strlen(aa)<<endl; //结果为0
char aa[10]="jun"; cout<<strlen(aa)<<endl; //结果为3
而sizeof()函数返回的是变量声明后所占的内存数,不是实际长度。
sizeof(aa) 返回10 int a[10]; sizeof(a) 返回40
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。
该类型保证能容纳实现所建立的最大对象的字节大小。
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
sizeof还可以用函数做参数,计算的是函数返回值类型所占内存字节数。比如:
1
2
shortf();
printf ( "%d\n" , sizeof (f()));
输出的结果是sizeof(short),即2。
4. 数组名做sizeof的参数时表示的仍然是数组不退化,数组名传递给strlen后就退化为 指针了。
5.大部分 编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因
1
2
3
charstr[20]= "0123456789" ;
inta= strlen (str); //a=10;
intb= sizeof (str); //而b=20;
6.strlen的结果要在运行的时候才能计算出来,是用来计算字符串的长度,不是类型占内存的大小。
7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
8.当使用于一个结构类型时或变量, sizeof 返回实际的大小,当使用于静态的空间 数组, sizeof 归还全部数组的尺寸。
sizeof 操作符不能返回被动态分派的数组或外部数组的尺寸
9.数组作为参数传给函数时传的是 指针而不是数组,传递的是数组的首地址,





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值