一个例子:char* ss = "0123456789";sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针sizeof(*ss) 结果 1 ===》*ss是第一个字符char ss[] = "0123456789";sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1sizeof(*ss) 结果 1 ===》*ss是第一个字符char ss[100] = "0123456789";sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前int ss[100] = "0123456789";sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以''/0''结尾的char q[]="abc";char p[]="a/n";sizeof(q),sizeof(p),strlen(q),strlen(p);结果是 4 3 3 2 第二个例子:class X{int i;int j;char k;};X x;cout<<sizeof(X)<<endl; 结果 12 ===》内存补齐cout<<sizeof(x)<<endl; 结果 12 同上第三个例子:char szPath[MAX_PATH] 如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
* 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 * 2.sizeof是算符,strlen是函数。 * 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以'/0'结尾的。sizeof还可以用函数做参数,比如: short f(); printf("%d/n", sizeof(f())); 输出的结果是sizeof(short),即2。 * 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。
注意编译器进行内存边界对齐
struct sample2{ char a; ///1 int b; ///4};#pragma pack( 8 ) /// 1 + 4 = 5 —> 8( 8 —> 4 )#pragma pack( 16 ) /// 1 + 4 = 5 —> 8( 16 —> 4 ) 说明:#pragma pack告诉编译器进行内存边界对齐,一般都是采用编译器的设置对整个项目采用同一对齐方案,而且通常为缺省8字节对齐。
补充一个——小数转2进制数
问:0.1十进制怎么转换成其他进制了?如八进制
可以先转换成二进制,用乘二取整法先转换 算式 整数 0.1 * 2 ------ 0.2 …… 0 /小数点后第一位 * 2 ------ 0.4 …… 0 * 2 ----- 0.8 …… 0 * 2 ------ 1.6 …… 1 ---》注:剩小数 0.6 * 2 ----- 1.2 …… 1 ---》 0.2 * 2 ------ 0.4 …… 0 …… …… …… ……下面好象是个循环了 结果 0.1D = 0.00011B //这里精确到小数点后5位 二进制再可以转化为其他进制,如八进制 方法是从小数点后三位一组,后面不够则加0,然后每组里,进行二进制和八进制的转化 上面的就是 0. 000 110 B = 0.06 O 二进制再可以转化为十六进制,跟八进制方法相同 唯一区别就是小数点后要四位一组