复习到数据结构一章,现在贴出sizeof 与strlen的区别,大都是从网上百度而来,做了一下整理,写了几个测试代码。
sizeof:
sizeof(.....) 是一种运算符,不是函数,所以你不要想在头文件里找到的它。sizeof的结果类型为size_t,也就是unsigned int 型。unsigned int 类型
在stdio.h头文件中被typedef为size_t,如图所示。
sizeof的功能是获得保证能容纳实现所建立的最大对象的字节大小。说白了就是计算某种参数所占内存的大小。它不受存储内容的影响。其值是在编
译的时候计算好了的,这就是为什么 sizeof 可以用来定义数组大小的原因。这也是 sizeof 不能用来返回动态分配内存的大小的原因。
具体而言,当 sizeof 参数如下时,返回值表示含义如下:
1、数组 :
当参数为数组时, sizeof 返回的是数组所占内存空几间的大小如:
char str[20]={"123456789"};
sizeof(str) 的结果为20, char 在32位机器上占一个字节,所以结果为 1 x 20;
如果是
int dat[9] = {1,2,3,4,5,6,7,8,9};
sizeof(dat) 的结果是36, int 在32位机器上占四个字节,所以结果为 4 x 9 ;
有三点需加以说明,
(1) 当数组作为传递参数时,不会退化为指针。这与 strlen 不同。
(2) 它的返回结果与数组存储内容无关,只要你定义了一个数组,如上面的dat[9] 和 str[20],不管数组是空还是满,结果都是不变的。
(3) 当传递的参数是静态的空间数组时,sizeof 将返回全部数组的尺寸。
2 、指针:
当参数是指针时, sizeof 返回的是存储该指针所用空间的大小,也就是与指针的数据类型有关如:
int *p;
sizeof(p) 的结果为4,因为32位机器上的指针当然是32位,即4个字节,所以需要4个字节的内存空间保存,而sizeof就是求参数所占内存空间的大小。
如果p是char型的,即:
char *p;
sizeof(p) 的结果是为1吗?当然不是,应该是4。刚才上面说的,在32位机器上,指针是4个字节的,所以保存指针的内存空间是4个字节。定义指针时前面的类 型名只是说明该指针指向的是该类型的变量,就像int *p ,只是说明p指向的是整型变量的地址,而char *p 说明它指向的是字符变量的地址。所以注意当
sizeof的参数为指针时,它的结果只与机器有关,而与指针的指向无关,不管是char int struct还是 union类型,也不管是否给它赋值 。再看下面这个例子:
int *p[10];sizeof(p)的结果为 40,即 4 x 10,原理还是一样。
3、函数:
当参数为函数时,返回的结果是函数返回值所占内存空间的大小,当然不能是无返回值的函数,即void 类型函数,例如。
int a ,b;
int fun1();
char fun2();
a = sizeof(fun1());
b = sizeof(fun2());
则在32位机器上,a的值是4,b的值是1。
4、类型:
sizeof的参数可以是构造类型,如结构体,联合体。下面各举一例。
struct STU
{
int a;
int b;
char c;
}student;
则在32位机器上,sizeof(student) 的结果为12。这个结果可能出乎大家意料,这涉及到内存空洞的问题,这里不多讨论
union STU
{
int a;
int b;
char c;
}student;
则在32位机器上,sizeof(student) 的结果为4。
5、对象:
当参数为对象时,返回的是该对象所占内存空间的大小。由于对对象我还没学习到,这里就不多说。
还有最后一点,如果后面的参数是类型时如 int char 或定义的结构体类型时,sizeof 后面的括号不能省,当是变量时,则可省略。因为 sizeof 是运算符,而并非函数。
strlen :
strlen是一个函数,在 string.h 头文件里有定义。由于strlen()是一个函数,所以它要在程序运行时才能计算,它的参数只能是字符型指针(char *str),即只能对字符串进行操作。它是用来计算一个以 '\0' 结束的字符串的长度,即字符的个数,但不包括'\0'。strlen返回的结果受字符串数组内容的影响。下面举几个例子:
eg 1:
char str[11] = {"1234567890"};
则strlen(str) 的结果是 10,因为str里面有10个字符。注意,在定义字符串数组时,字符串大小要比你所放字符个数多一个,因为编译器会自动在后面加一个'\0'结束标 。因此你指定的字符串数组大小必须要比字符个数多一个。要么就不指定大小,如 char str[] = {"1234567890"}; 这只适合在赋初值的情况。
eg 2:
char str[12] ={'12345\067890'};
则strlen(str) 的结果是5,因为遇到'\0'时就结束。如果是 char str[12] ={'\01234567890'}; 结果就是0。
当数组名作为参数传递给strlen时,数组就会退化成指针,指向字符串的首址。