sizeof和strlen的区别

来源:互联网 发布:国际学校知乎 编辑:程序博客网 时间:2024/06/15 20:38

一 sizeof
1.sizeof是一个运算符,它在头文件中被重命名为unsigned int .
2.它的作用是计算一种数据类型所占的字节数。
3.它的对象可以是数组,指针,对象,函数,结构体等。
4.它在编译阶段就完成了大小计算,所以不可以用来计算动态分配的空间的大小,而且sizeof的值与空间中的内容无关
5.sizeof计算各种数据类型时的含义:
数组名–表示数组类型的字节数(如 int arr[10] sizeof(a)/sizeof(a[0])表示计算int [10]这一数据类型的大小)
函数名–表示计算函数返回值的类型的字节数
指针–表示某一类型的地址的字节数(地址一般都占四个字节的大小)
对象–对象所有有效类型所占空间的和
例如

public:    void Fun()//无论返回值为什么类型,都不算大小    {        cout << endl;    }private:    int a;//大小为4    int b;//大小为4

这时对象的大小为8个字节
但是这里要注意一个特例,就是函数被声明为virtual的时候,无论返回值的类型是什么,它的大小都为4。大家可以自己上机试验一下。

二.strlen
strlen 是一个函数,它是在运行时才计算数值的。它用来计算有效字符的个数,遇到NULL的时候停止计算。而且它的参数只能是字符数组名或者字符指针。当传入的参数是数组名的时候,数组名退化为指针。

三。接下来给出一些实例
int a[] = {1,2,3,4};
printf(“%d\n”,sizeof(a));//16
printf(“%d\n”,sizeof(a+0));//4 首元素的地址向后移动0个位置
printf(“%d\n”,sizeof(*a));// 4 a代表首元素的地址,这里就是首元素的大小
printf(“%d\n”,sizeof(a+1));//4 首元素的地址向后移动一个元素的元素地址
printf(“%d\n”,sizeof(a[1]));// 4 a【1】纸的大小
printf(“%d\n”,sizeof(&a));//4 取数组的地址
printf(“%d\n”,sizeof(&a+1));//4 数组的地址加一个数组长度的地址,即下一个数组的地址
printf(“%d\n”,sizeof(&a[0]));//4 数组首元素的地址
printf(“%d\n”,sizeof(&a[0]+1));//4 数组第二个元素的地址

int a[3][4] = {0};
printf(“%d\n”,sizeof(a));//48 数组名 代表首元素的地址,在sizeof中数组名代表整个数组元素,这里就是整个数组元素
printf(“%d\n”,sizeof(a[0][0]));//4, a【0】【0】的值
printf(“%d\n”,sizeof(a[0]));//16 一维数组名 代表第0行的元素
printf(“%d\n”,sizeof(a[0]+1));//4 .a【0】【1】的地址
printf(“%d\n”,sizeof(a+1));//4. 第2行的地址
printf(“%d\n”,sizeof(&a[0]+1));//4 第2行的地址
printf(“%d\n”,sizeof(*a));//16. a代表数组首元素的地址,即第一行的地址,这里的值为第一行的元素大小
printf(“%d\n”,sizeof(a[3]));//16 这一行的元素

char *name=”abcde”;
strlen(&name+1); 从 存储指针name的空间的下一块空间开始找\0
strlen(&name); 从&name指向的地址(即name这个指针的内容)第一个字符开始找\0
strlen(name); 给的是一个指针的话,是从该指针指向的地址(即从a开始)开始找一直到\0为止

0 0