sizeof and strlen整理
sizeof
- 定义
- 计算对象或类型所占用的字节数(byte)
- 记住是字节数,而不是个数
- 计算对象或类型所占用的字节数(byte)
- 语法
- sizeof(对象)
- int i; sizeof(i);
- sizeof(类型)
- sizeof(int);
- sizeof 对象
- int i; sizeof i;
- 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的常量性
- sizeof的计算发生在编译时刻
- 基本数据类型的sizeof
- 32位和64位机器的最大区别
- 32位机器:指针代表寻址空间, 32位的寻址空间是2^32, 即32个bit,也就是4个字节
- 64位机器,很显然就是8个字节
- 所以sizeof(指针),32位得4bytes,64位得8bytes,但是其他的基本数据类型是一致的,如sizeof(int)都是4个字节。
- 32位和64位机器的最大区别
- 数组的sizeof
- 静态分配的数组
- sizeof是编译时确定要处理的对象的真实内存大小(包括字符串的结束符)
- char a[] = "123"; sizeof(a); //4bytes,显然a的大小已经确定了,'1','2','3','\0'
- char a[20] = "123"; sizeof(a); //20bytes,显然a的大小也是确定的
- int a[20] = {1,2,3}; sizeof(a); //80bytes
- int a[] = {1,2,3}; sizeof(a); //12bytes
- 数组名作为实参传递给函数,那么对函数的形参会退化为指针
- int function(int a[],int* b, char c[],char* d)
- sizeof(a)、sizeof(b)、sizeof(c)、sizeof(d)都是指针的大小,4bytes
- sizeof是编译时确定要处理的对象的真实内存大小(包括字符串的结束符)
- 动态分配的数组
- 很显然,动态分配的数组在编译时是无法知道数组的大小
- 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编译器会在结构体成员之后进行字节填充!
- sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!
struct A{
int num1;
int num2;
double num3;
};
sizeof(A)//16
struct B{
int num1;
double num3;
int num2;
};
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的结尾,所以得到的长度每次运行都不一样。
- 静态字符数组
- 返回字符串的长度。