sizeof and strlen整理
sizeof数组
- 定义
- 语法
- sizeof(对象)
- sizeof(类型)
- sizeof 对象
- sizeof(2);sizeof(2+3.14);
- sizeof()能够对一个表达式求值,可是它是根据表达式的类型进行求值。
- 至关于sizeof(int);sizeof(double);
- sizeof(function())
- sizeof()能够对一个函数调用求值,其结果是函数返回类型的大小,记住函数是不会被调用的。
- int function(); sizeof(function());//4
- 返回值类型是没有肯定的函数,不能调用sizeof;
- void function(); sizeof(function());//error
- void function(); sizeof(function); //error
- sizeof的常量性
- 基本数据类型的sizeof
- 32位和64位机器的最大区别
- 32位机器:指针表明寻址空间, 32位的寻址空间是2^32, 即32个bit,也就是4个字节
- 64位机器,很显然就是8个字节
- 因此sizeof(指针),32位得4bytes,64位得8bytes,可是其余的基本数据类型是一致的,如sizeof(int)都是4个字节。
- 数组的sizeof
- 静态分配的数组
- sizeof是编译时肯定要处理的对象的真实内存大小(包括字符串的结束符)
- 数组名做为实参传递给函数,那么对函数的形参会退化为指针
- int function(int a[],int* b, char c[],char* d)
- sizeof(a)、sizeof(b)、sizeof(c)、sizeof(d)都是指针的大小,4bytes
- 动态分配的数组
- 很显然,动态分配的数组在编译时是没法知道数组的大小
- n待输入;int* a=new int[n];sizeof(a); //4
- 因此对于动态分配的数组sizeof将转换为对指针的sizeof
- 指针--该指针指向字符数组
- char *a = "12345"; sizeof(a); //4
- 上述和char b[] = "12345"仍是有区别的,sizeof(b) //6
- 结构体的sizeof
- sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
- 结构体的大小等于结构体内最大成员大小的整数倍
- 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍
- 为了知足规则1和2编译器会在结构体成员以后进行字节填充!
struct A{函数
int num1;spa
int num2;3d
double num3;指针
};对象
sizeof(A)//16
struct B{内存
int num1;字符串
double num3;编译器
int num2;it
};
sizeof(B) //24
strlen
- 定义
- 返回字符串的长度。
- 从字符串的第一个字符开始遍历,直到遇到结束符NULL。返回的长度不包括NULL。
- 运行时计算长度,这个sizeof恰好相反
- 静态字符数组
- char a[] = "123";strlen(a);//3,遇到NULL中止,不包括NULL
- char a[] = "";strlen(a);//0,不包括NULL
- char a[20] = "123";strlen(a);//3
- char* a= "123";strlen(a);//3
- 动态字符数组
- char *a = new char[20];strlen(a);//27
- 上述并不知道NULL的结尾,因此获得的长度每次运行都不同。
欢迎关注本站公众号,获取更多信息