结构体的大小以及sizeof()和strlen()的区别
一:
sizeof运算符,可用于任何变量名,类型名或常量值,当用于用于变量名(不是数组名)或常量时,它不需要圆括号。它在编译时起作用,而不是运行时。
PS:
求结构体的sizeof()大小有两个规则(内存对齐):
1.:上一个变量是下一个变量的整数倍。
2.:结构体整体的大小是每一个变量的整数倍。
例如:
struct D
{
char a; //1+3
int c; //4
short b; //2
} //10 +2
分析:结构体D中:a占用1个字节,c占用4个字节,a需要变成从c的整数倍,所以a变成1+3=4字节.
a+b+c一共10个字节,整体需要时每一个的整数倍,所以10+2 = 12.
12是a、b、c每一个变量的整数倍。
又例如:
struct A
{
char a; //1+2
short b; //2
int c; //4
} //8
指针的sizeof操作:所有指针变量的sizeof结果均为4.
经典例题:
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 a为指针
cout<<sizeof(*a)<<endl; // 72 *a为一个有3*6个指针元素的数组
cout<<sizeof(**a)<<endl; // 24 **a为数组一维的6个指针
cout<<sizeof(***a)<<endl; // 4 ***a为一维的第一个指针
cout<<sizeof(****a)<<endl; // 8 ****a为一个double变量
问题解析:a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。
既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof (double*)=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。
-----------------------------------------------------------------
二:
strlen()函数:
strlen所作的仅仅是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0'为止,然后返回计数器值(长度不包含'\0')。
extern unsigned int strlen(char *s);
在Visual C++ 6.0中,原型为size_tstrlen(const char *string); ,其中size_t实际上是unsigned int,在VC6.0中可以看到这样的代码:typedef unsigned int size_t; 。
头文件:string.h
格式:strlen (字符数组名)
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内
说明:返回s的长度,不包括结束符NUL。
-----------------------------------------------------------------
三、区别:
1.strlen(char *)函数求字符串实际长度,遇到字符'\0'停止,不包含符'\0'。
sizeof()返回的值变量声明后所占内存数,不是实际长度。
2.strlen是函数,sizeof是操作符(关键字)。
3.sizeof可以用类型(int,double···)做参数,也可以用函数做参数;strlen只能用char*做参数
4.数组做sizeof的参数不退化,而数组传递给strlen就退化为指针。
例题:
char str1[100] = "abcde";
char str2[] = "abcde";
char *str3 = "abcde";
char str4[100] = "abcde\0ijk";
char str5[] = "abcde\0ijk\n";
char *str6 = "abcde\0ijk";
printf("%d %d\n",sizeof(str1),strlen(str1));
printf("%d %d\n",sizeof(str2),strlen(str2));
printf("%d %d\n",sizeof(str3),strlen(str3));
printf("%d %d\n",sizeof(str4),strlen(str4));
printf("%d %d\n",sizeof(str5),strlen(str5));
printf("%d %d\n",sizeof(str6),strlen(str6));
结果:
----------------------------------------------
ps:字符串常量和字符
char *str1 = "abcde"; //字符串常量,保存这个字符串的首地址
char str[2] = "abcde";//字符数组
str[0] = 'x';//这句不报错,编译可通过,但不能执行.因为str[0]为*str(字符串的首地址)
str[0] = 'x';//这句正确