sizeof和strlen的区别,数组和指针的区别

sizeof和strlen的区别:

1.sizeof是个关键字,因此,sizeof后面是变量名时可以不加括号,而strlen是个函数,必须加括号

2.sizeof是判断参数所占的内存大小,参数可以是类型,函数,而strlen有点像计数器,从某个内存地址开始计数,碰到"\0"时结束计数,参数只能是char *

3.sizeof编译时确定,strlen时运行时确定

4.在调用函数中,数组名作为形参的,会被编译器当成指向数组首地址的指针,因此作为sizeof的参数时等价于计算指针的大小,作为strlen()的参数时意义未改变


--测试sizeof关键字特性

#include <iostream>
using namespace std;

void main(void)
{
	int a;
	char c[10];
	char *p;
	cout<<<span style="color:#ff0000;">sizeof a</span><<endl;
	cout<<sizeof c<<endl;
	cout<<sizeof p<<endl;
}

测试结果



--测函数作为sizeof参数

#include <iostream>
using namespace std;

int fun_int();
char fun_char();
float fun_float();
double fun_double();
char *fun_cp();
double *fun_cd();
void *fun_cvoid();
void fun_void();

void main(void)
{
	cout<<sizeof(fun_int())<<endl;			//等价于sizeof(int)
	cout<<sizeof(fun_char())<<endl;			//等价于sizeof(char)
	cout<<sizeof(fun_float())<<endl;		//等价于sizeof(float)
	cout<<sizeof(fun_double())<<endl;		//等价于sizeof(double)
	cout<<sizeof(fun_cp())<<endl;			//等价于sizeof(指针)
	cout<<sizeof(fun_cd())<<endl;			//等价于sizeof(指针)
	cout<<sizeof(fun_cvoid())<<endl;		//等价于sizeof(指针)
	cout<<sizeof(fun_void())<<endl;			//编译器错误
}


由编译结果可知,当函数作为sizeof的参数时,实际上是用函数的返回值作为sizeof的参数,因此函数必须有返回值


--不用库函数实现strlen()函数

size_t mystrlen(const char *str)
{
	size_t i = 0;
	while(str[i]!='\0')
		i++;
	return i;
}


--测试数组作为参数传递时sizeof和strlen()不同的表现

#include <iostream>
using namespace std;

void fun(char *str)
{
	cout<<endl<<"fun"<<endl;
	cout<<"sizeof(str)="<<sizeof(str)<<endl;
	cout<<"strlen(str)"<<strlen(str)<<endl;
}
void main(void)
{
	char str[10];
	cout<<"sizeof(str)="<<sizeof(str)<<endl;
	cout<<"strlen(str)"<<strlen(str)<<endl;
	fun(str);

}

运行结果:



结果中显示,当数组作为参数传递给函数时,sizeof 计算出来的值是指针的值,而不再是指针所指向的内存空间大小的值。但是是不是有点奇怪?str明明是10个字节,strlen(str)怎么就变成15个字节了?

通过调试查看内存:



结果显而易见了,因为没有初始化数组,因此数组内部为乱码,当执行strlen(str)时,strlen()从地址0x0019FF34开始计数,一直计数到0x0019FF40,读取到00('\0')时才结束,因此算出了大小15个字节,由此可见

初始化特别重要,可以避免不必要的错误!



前面的介绍中有提到数组和指针作为参数时对sizeof和strlen()的影响,但是还不够全面,由于strlen的参数只能是char *类型,因此测试的数字也只能是char []的数组,下面详细介绍数组和指针的区别:


数组和指针的区别:

1.定义时,当等号右边为字符串时,数组是是分配在非常量区,指针指向的字符串被分配在在常量区(只读),因此数组可通过下标更改其值,指针不可更改!

2.占用的空间大小不同,数组占用所申请的内存大小,指针为4个字节(假定计算机的寻址大小为32位)

#include <iostream>
using namespace std;


void main(void)
{

	static char sc[]="hello";
	static char *sp="hello";
	char c[] = "hello";
	char *p="hello";

	sc[0]='a';		//可更改
	sp[0]='a';		//运行时报错
	c[0]='a';		//可更改
	p[0]='a';		//运行时报错
}



使用数组时要特别注意,当数组名作为参数传递给其他函数时,会变成指针的形式传递。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值