一个例子:
char* ss = "0123456789";
sizeof(ss) 结果 4 ===》ss是指向字符串常量的字符指针
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[] = "0123456789";
sizeof(ss) 结果 11 ===》ss是数组,计算到/0位置,因此是10+1
sizeof(*ss) 结果 1 ===》*ss是第一个字符
char ss[100] = "0123456789";
sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
strlen(ss) 结果是10 ===》strlen是个函数内部实现是用一个循环计算到/0为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
strlen(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
二进制再可以转化为十六进制,跟八进制方法相同
唯一区别就是小数点后要四位一组