简介
sizeof 的总结: http://blog.csdn.net/xyh_adolph/article/details/21187783
sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示,返回值类型是size_t
对char 类型或值为char 类型的表达式做sizeof 操作保证得1;
对引用类型做sizeof 操作将返回存放此引用类型对象所需的内存空间大小;
对指针做sizeof操作,返回存放指针所需的内存大小(4字节)
注意,如果需获取该指针所指向对象类型的大小(如int 对象那么是4字节),则必须对该指针进行解引用。
特别要注意的时,对于指针类型,都占4个字节,因为指针指向的是一个地址,32位操作系统就是4字节。当然如果是64位操作系统那就是8字节了。所以一般情况下 sizeof (p)=4
对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。因为sizeof返回整个数组在内存中的存储长度;
用sizeof 数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。
==================================================================================================
一、关于sizeof
- sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示,返回值类型是size_t
- sizeof(变量)就是求 p30那些类型所占字节(常用的!!!记住!!!)
- sizeof 表达式的结果是编译时常量,有三种语法形式:
- sizeof (type name);
- sizeof (expr);
- sizeof expr;
Sale_item item,*p;
sizeof(Sale_item);
sizeof item;
sizeof *p;
将sizeof 应用在表达式expr上,将获得该表达式的结果的类型的长度(还是针对类型) ;
将sizeof用于expr时,并没有计算表达式expr的值。。
使用sizeof 的结果部分地依赖所涉及的类型:
对char 类型或值为char 类型的表达式做sizeof 操作保证得1 相当于sizeof(char);
对引用类型做sizeof 操作将返回存放此引用类型对象所需的内存空间大小;
对指针做sizeof操作,返回存放指针所需的内存大小( 4 字 节 !!!! ):如 sizeof (p)=4
注意,如果需获取该指针所指向对象类型的大小,则必须对该指针进行解引用。sizeof (* p),根据 指针p的类型,如果p是整型,那么就是 4 字节
特别要注意的时,对于指针类型,都占4个字节,因为指针指向的是一个地址,32位操作系统就是4字节。当然如果是64位操作系统那就是8字节了。所以一般情况下 sizeof (p)=4
对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数。因为sizeof返回整个数组在内存中的存储长度;
用sizeof 数组的结果除以sizeof其元素类型的结果,即可求出数组元素的个数。
//例子1
double y[10]; //double 类型的数组,每个double类型占8字节
int x[10]; //int 类型的数组,每个int类型占4字节
int *p=x;
double *p1=y; //double类型的指针才能指向double类型的数组,别写成int *p1=y
char q='a';
cout<<sizeof(q)<<endl; //输出的是1
cout<<sizeof(x)<<endl; //sizeof(数组名),输出的是整个数组在内存中的存储长度,输出的是4*10=40
cout<<sizeof(y)<<endl; //sizeof(数组名),输出的是整个数组在内存中的存储长度,输出的是80
cout<<sizeof(p)<<endl;//sizeof(指针),输出的是指针所需内存大小,4个字节
cout<<sizeof(p1)<<endl;//sizeof(指针),输出的是指针所需内存大小,4个字节
cout<<sizeof(*x)<<endl;//*x=x[0]的值,x[0]是int型的数,所以输出的是整型数所占用的空间大小4字节
cout<<sizeof(*y)<<endl;//*y=y[0]的值,所以输出的是double型数所占用的空间大小8字节
cout<<sizeof(*p)<<endl;//输出指针p所指对象x[0]所占大小,因为是int型,所以输出的是4
cout<<sizeof(*p1)<<endl;//输出指针p所指对象y[0]所占大小,因为是double型,所以输出的是8
cout<<sizeof(x)/sizeof(*x)<<endl;//输出数组元素的个数,是10
cout<<sizeof(p)/sizeof(*p)<<endl;//输出元素的个数,是1
//输出结果
1
40
80
4
4
4
8
4
8
10
1
//上机实践一下这题
void Func ( char str[100])
{
sizeof( str ) = 4 //数组名str做形参时,是一个指针,所以为4
}
//str 是数组名
char str[] = “Hello” ;
char *p = str ;
int n = 10;
sizeof (str ) = 6
sizeof ( p ) = 4
sizeof ( n ) = 4
//例子2 用sizeof()函数计算每种类型变量所占用的内存大小,用字节表示
int main()
{
int a;
long b;
int *c;
char *d;
string s1("helloworld");
int Byteof_int=sizeof(a);
int Byteof_long=sizeof(b);
int Byteof_int_point=sizeof(c);
int Byteof_char_point=sizeof(d);
int Byteof_string=sizeof(s1);
cout << "int:" <<Byteof_int<<endl;
cout << "long:" <<Byteof_long<<endl;
cout << "int *:" <<Byteof_int_point<<endl;
cout << "char *:" <<Byteof_char_point<<endl;
cout << "string:" <<Byteof_string<<endl;
return 0;
}
//显示结果
/*
int : 4
long :4
int *:4
char *:4
string:4
//总结
int : 4 字节
long :4 字节
bool:1字节
char:1字节
wchar_t:2字节
float:4字节
double:8 字节
指针类型:4 字节
string类型:4字节
//习 题 5.18 string类指针和string类对象用sizeof
int main(){
//读取vector对象与初始化该对象
vector<string*> spvec; //注意是string 类型的指针,所以*不要忘记
string str;
cout<<"enter string (ctrl+z to end)"<<endl;
while(cin>>str)
{string *pstr=new string;//指向string对象的指针
*pstr=str;
spvec.push_back(pstr);
}
//输出每个string的内容及其相应的长度
vector<string*>::iterator iter=spvec.begin();
while(iter!=spvec.end())
{
cout<<(**iter)<<endl;//使用的是vector里面的迭代器iter ,所以第一次解引用时,求得的是vector里面的元素,即string类的指针,第二次解引用求得的是该指针指向的对象的值
cout<<(**iter).size()<<endl;//因为是要输出string的长度,即里面有几个元素,那么就使用string对象自带的size函数
cout<<sizeof(*iter)<<endl;//*iter表示的是string类型的指针,相当于是sizeof(string *),对指针使用sizeof函数,将返回存放该指针所需的内存大小,返回4字节
cout<<sizeof(**iter)<<endl;//**iter是string指针所指的string对象,sizeof(**iter)求得的就是指针所指的对象的大小,string类型占用内存的大小是 4字节
iter++;
}
//释放各个动态分配的string对象
iter =spvec.begin();
while(iter!=spvec.end())
{delete *iter; //删除string对象所占用的内存空间,所以是*iter
iter++;}
return 0;
}
//输入:abcde qwertyu
//输出结果:
abcde qwertyu
5 7
4 4
4 4
//指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。
//