c语⾔中strlen⽤到的头⽂件,C语⾔中sizeof()与strlen()函
数的使⽤⼊门及对⽐
sizeof()函数1,是什么?
sizeof其实就是⼀个运算符,和那些+,-⼀样的东西,在程序编译的时候进⾏解析转换。虽然我们经常见到sizeof后⾯跟着个⼩括号,长得和函数差不多,但它和函数完全是两码事。
2,有什么⽤?sizeof 指针
sizeof其实就是⽤于告诉我们编译器在为某⼀特定数据或者某种数据类型的数据在存储空间中开辟空间时,开辟的空间⼤⼩,以字节为单位。
3,怎么⽤?
sizeof(类型),或者sizeof(变量)都可以,得到的就是类型或者变量的存储空间。当对变量⽤的时候,也可以没有括号,直接 sizeof 变量,但⼀般不⽤(我⼀般都是只记⼀种通⽤的⽤法……)。
4,⽤的时候要注意什么?
(1)sizeof返回的占⽤空间⼤⼩是为这个变量开辟的⼤⼩,⽽不只是它⽤到的空间。和现今住房的建筑⾯积和实⽤⾯积的概念差不多。所以对结构体⽤的时候,⼤多情况下就得考虑字节对齐的问题了。
(2)对位域成员等连编译器都⽆法确定存储空间的东西不能⽤。这个应该⽐较好理解,因为sizeof返回的都是以字节为单位的数据,你让它去求那些以位为单位的⼤⼩,这不是存⼼难为编译器嘛。所以编译器采⽤的⽅案是统⼀不受理,即使你说你刚好是8位,占⼀个字节,编译器也不理你。
(3)sizeof返回的数据类型是unsigned int。因为C中不同类型数据混合运算时的⾃动转换,有时候不注意的话可能会出问题,具体可以参照下⾯的程序例⼦。
(4)要注意数组名和指针变量的区别。通常情况下,我们总觉得数组名和指针变量差不多,但是在⽤sizeof的时候差别很⼤,对数组名⽤sizeof返回的是整个数组的⼤⼩,⽽对指针变量进⾏操作的时候返回的则是指针变量本⾝所占得空间,在32位机的条件下⼀般都是4。⽽且当数组名作为函数参数时,在函数内部,形参也就是个指针,所以不再返回数组的⼤⼩。
5,实例分析
源码:
#include
int main()
{
int iVal = 3;
printf("The size of type int is %d \n", sizeof(int));
printf("The size of iVal is %d\n", sizeof(iVal));
printf("The size of iVal is %d\n", sizeof iVal);
if((iVal - sizeof(int)) < 0)
{
printf("The return type is int\n");
}
else
{
printf("The return type is unsigned int\n");
}
char chArrayCon[7];
char *chp;
chp = chArrayCon;
printf("The size of chArrayCon is %d, The size of chp is %d\n", sizeof(chArrayCon), sizeof(chp));
int iArraySize = 3;
char chArrayVar[iArraySize];
printf("The size of chArrayVar is %d\n", sizeof(chArrayVar));
return 0;
}
运⾏结果:
The size of type int is 4
The size of iVal is 4
The size of iVal is 4
The return type is unsigned int
The size of chArrayCon is 7, The size of chp is 4
The size of chArrayVar is 3
结果分析:
代码第⼀部分主要就是简单的表⽰了⼀下⽤法。
第⼆部分说明了注意事项的第三项。按说,iVal的值是3,减4的话应该是-1,⼩于0,输出的应该是"he
return type is int"。但是由于当int和unsigned int⼀起运算时,会默认变成unsigned int,所以结果会是⼀个很⼤的unsigned int类型的数,是⼤于0的。
代码第三部分就简单说明了数组名和指针变量的区别,即使你把指针变量指向数组名,编译器依然能够分辨出区别。
以上讲述的都没有考虑在C99标准下的情况。因为在C99标准下有种特殊情况,那就是不定长数组的使⽤。当对不定长数组名使⽤sizeof的话,返回的也是整个数组的⼤⼩,就像实例中第四块代码⼀样。但是这并不是在编译阶段执⾏的,⽽是在程序运⾏阶段执⾏的。因为在编译的时候,编译器⼀般不知道变量的值是多少。(当然例⼦中我直接赋值3,可能不⽅便理解,可以假想iArraySize是通过scanf来获得实际数值的,然后再声明数组的)。对于这种情况,实际中应⽤的并不多,⼤家可以当做特殊情况对待即可,或者直接忽略掉也⾏……
6总结
其实sizeof的作⽤就是告诉我们分配给变量的“建筑⾯积”的⼤⼩,只要记得这⼀点应该就够了,不管这个变量类型是普通的整型数据,还是结构体,共⽤体,枚举……记住这⼀点后,当我们再去想知道sizeof对不同数据类型操作返回的值到底是什么的时候,只需搞明⽩那些数据类型到底要消耗多少“建筑⾯积”就可以啦!
strlen()函数C库函数 size_t strlen(const char *str) 计算字符串str的长度,但不包括终⽌空字符。
声明
以下是声明的strlen() 函数。
size_t strlen(const char *str)
参数
str -- 这是字符串的长度要计算的。
返回值
这个函数返回字符串的长度。
例⼦
下⾯的例⼦显⽰使⽤strlen() 函数。
#include
#include
int main ()
{
char str[50];
int len;
strcpy(str, "This is yiibai");
len = strlen(str);
printf("Length of |%s| is |%d|
", str, len);
return(0);
}
让我们编译和运⾏上⾯的程序,这将产⽣以下结果:
Length of |This is yiibai| is |26|
sizeof与strlen的⽤法区别1. sizeof操作符的结果类型是size_t,它在头⽂件中typedef为unsigned int类型。该类型保证能容纳实现所建⽴的最⼤对象的字节⼤⼩。
2. sizeof是运算符(C++ 关键字),strlen是函数。
3. sizeof可以⽤类型做参数,strlen只能⽤char*做参数,且必须是以”\0”结尾的。sizeof还可以⽤函数做参数,⽐如:
short f();
printf("%d\n", sizeof(f()));
输出的结果是返回值的类型的⼤⼩, 即sizeof(short)=2。
4. 数组做sizeof的参数不退化,传递给strlen就退化为指针了。⼤部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度,这就是sizeof(x)可以⽤来定义数组维数的原因。
char str[20]="0123456789";
int a=strlen(str); //a=10;
int b=sizeof(str); //b=20;
⽽strlen的结果要在运⾏的时候才能计算出来,是⽤来计算字符串的长度,不是类型占内存的⼤⼩。
5. sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
6. 当适⽤了于⼀个结构类型时或变量, sizeof 返回实际的⼤⼩,当适⽤⼀静态地空间数组, sizeof 得到全部数组的尺⼨。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺⼨。
7. 数组作为参数传给函数时传的是指针⽽不是数组,传递的是数组的⾸地址,如:
fun(char [8])
fun(char [])
都等价于 fun(char *)。
在C++⾥参数传递数组永远都是传递指向数组⾸元素的指针,编译器不知道数组的⼤⼩。如果想在函数内知道数组的⼤⼩, 需要这样做:进⼊函数后⽤memcpy拷贝出来,长度由另⼀个形参传进去
fun(unsiged char *p1, int len)
{
unsigned char* buf = new unsigned char[len+1]
memcpy(buf, p1, len);
}
sizeof对指针的话,结果是相应的类型:
char* ss = "0123456789";
sizeof(ss)
结果是4 => ss是指向字符串常量的字符指针,sizeof 获得的是⼀个指针的之所占的空间,应该是长整型的,所以是4. sizeof(*ss) 结果 1, => *ss是第⼀个字符,其实就是获得了字符串的第⼀位“0” 所占的
内存空间,是char类型的,占了1个字节,strlen(ss)= 10 >>>> 如果要获得这个字符串的长度,则⼀定要使⽤ strlen.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论