本文共 4406 字,大约阅读时间需要 14 分钟。
一、由几个例子说开去。
第一个例子: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<<
第三个例子:
char szPath[MAX_PATH]
如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
二、sizeof深入理解。short f();printf("%d/n", sizeof(f()));输出的结果是sizeof(short),即2。
char str[20]="0123456789";int a=strlen(str); //a=10;int b=sizeof(str); //而b=20;
fun(char [8])fun(char [])都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小, 需要这样做:进入函数后用memcpy拷贝出来,长度由另一个形参传进去
fun(unsiged char *p1, int len){ unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len);}有关内容见: C++ PRIMER?
三、结束语
sizeof使用场合。void *malloc(size_t size), size_t fread(void * ptr,size_t size,size_t nmemb,FILE * stream)。
void * memset(void * s,int c,sizeof(s))
sizeof的总结: 基本类型:
sizeof(bool)=1; sizeof(char)=1; sizeof(short)=2; sizeof(long)=4; sizeof(int)=4; sizeof(float)=4; sizeof(double)=8; sizeof(string)=16; sizeof(vector<elemType>)=16; 元素类型为T,个数为n的数组array: sizeof(array)=n*sizeof(T); 指针和引用: sizeof作用于指针变量时,结果总是为4,而作用于引用变量时,结果等于所引用的变量的size。如: double a; double* b=&a; double& c=a; 则sizeof(b)=4;sizeof(c)=8。 类: 1)无父类的类 : 其size原则上等于其非静态成员变量的size之和: class CTest1{ public: int a,b static double c; double d; }; sizeof(CTest1)=sizeof(a)+sizeof(b) +sizeof(d)=4+4+8=16; 为什么说原则上等于呢?因为变量只能在内存中一个字的开头存储,所以定义成员变量的顺序可能会影响到类的size,如将上面的CTest1改为 class CTest2{ public: int a; static double c; double d; int b; }; sizeof(CTest2)=24; 可以看出类中成员变量的定义顺序会影响到内存的利用率,这是跟编译器的对齐方式有关。 2)派生类:需要加上其基类的size class CTest3:CTest1{ public: int e; }; sizeof(CTest3)=24 3)class CTest4{}; //sizeof(CTest4)=1 class CTest5{virtual ~CTest5(){}};//sizeof(CTest5)=4
C++中sizeof与strlen函数的区别本文来自: IT知道网() 详细出处参考:
1. sizeof 操作符的结果类型size_t,它在头文件中typedef为unsigned int类型: typedef unsigned int size_t.
2. sizeof是是长度运算符, 获得数据类型或是变量的长度,如果是数据类型,则返回数据类型大小,如果是用数组,则 返回数组所占空间大小,strlen是计算字符串长度的函数,返回的是实际串长度,以char* 作参数 ,且必须是以'/0'结尾。
3. sizeof在编译的时候就把计算过,strlen的结果要在运行的时候才能计算出来。
4. 数组做长度运算符sizeof的参数不退化。数组做函数strlen的参数就退化为指针了,因为数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址。
附:
转载地址:http://igvxi.baihongyu.com/