C++primer 5.8sizeof 操作符--上(不同类型所占用的内存大小字节)

简介

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。
//
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值