首页 > 编程知识 正文

c语言指针,c语言常量

时间:2023-05-06 09:34:40 阅读:162529 作者:2921

sizeof的概念sizeof是C语言的单眼操作符,如C语言的其他操作符、---等。 不是函数。 sizeof操作符以字节为单位给出操作数的存储大小。 操作数可以是表达式或用括号括起来的类型名称。 操作数的存储大小取决于操作数的类型。sizeof的使用方法1,用于数据类型

sizeof的使用形式:sizeof(type ) ) )。

数据类型必须用括号括起:sizeof(int )

2、用于变量

sizeof使用格式:sizeof(var_name )或sizeof var_name

变量名不需要括在括号中。 例如,sizeof(var_name )、sizeof var_name )等格式正确的括号用法更常见,许多程序员都采用这种格式。  

注意: sizeof操作符不能用于函数类型、不完整类型或位字段。 不完整类型是具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或绑定类型、void类型等。  

例如,sizeof(max )--其中变量max是int max; sizeof(char_v )--如果此时char_v被定义为char char _ v [ max ],且max未知,则sizeof ) void )或更高版本的格式都不正确。 sizeof的结果1、ANSI C正式规定字符类型为1个字节。  

Sizeof(char )=1;

sizeof(unsignedchar )=1;

sizeof(signedchar )=1;

2、其他类型ANSI C无具体规定,大小取决于实现。

Sizeof(int )=4;

sizeof(unsignedint )=4;

sizeof(shortint )=2;

sizeof(unsignedshort )=2;

Sizeof(longint )=4;

sizeof(unsignedlong )=4;

Sizeof(float )=4

sizeof(double )=8;

Sizeof(longdouble )=12; //gcc 32位编译器

Sizeof(longdouble )=16; //gcc 64位编译器

3、如果操作数是指针,则sizeof依赖于编译器。

熟悉数据结构的人应该知道指针是记录另一个对象地址的重要概念。 因为是来存储地址的,所以和计算机内部的地址总线的宽度一样。 因此,在32位计算机中,一个指针变量的返回值必须为4 (注意结果以字节为单位),在64位系统中指针变量的sizeof结果为8。

例如: char *p;

Sizeof(p )=4; //gcc 32位编译器

Sizeof(p )=8; //gcc 64位编译器

4 .如果操作数具有数组类型,则结果为数组的总字节数。

例如: char a[5];

int b[5];

Sizeof(a )=5;

Sizeof(b )=20;

5、当操作数为具体字符串或数值时,根据具体类型进行转换。

例如:sizeof(8)=4; //自动转换为int类型

Sizeof(8.8 )=8; 自动转换为双精度类型。 注意不是浮动类型

sizeof(ab ) )=3 //自动转换为数组类型,

6 .如果操作数是连接类型,则sizeof是其最大字节成员的字节数。 如果操作数是结构类型,则sizeof是其成员类型的总字节数,包含补充字节。 举个例子说吧:

对unionu//union来说

char c;

双精度d;

) u;

sizeof(u )=max ) sizeof(c ),sizeof (d )=sizeof ) 1,8 )=8;

struct a{ /

/对struct来说
       char b; 
       double x;
    }a;   
   sizeof(a) = 16;  而一般sizeof(char) + sizeof(double) = 9; 
  这是因为编译器在 考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。但如果全对齐的话,sizeof(a) = 16, 这是因为b被放到偏移量为0的地址,占1个字节;在存放x时,double类型长度为8,需要放到能被8整除的偏移量上,这时候需要补7个空字节, 达到8个,这时候偏移量为8,放上x后长度为16。
struct S1 {char c;double d;};union u { //对union来说char c;double d;} u;int a;char b;short c;double d;float f;int *p;char a1[]="abcd";int a2[3];printf("int=%dn",sizeof(a));printf("char=%dn",sizeof(b));printf("short=%dn",sizeof(c));printf("double=%dn",sizeof(d));printf("float=%dn",sizeof(f));printf("指针=%dn",sizeof(p));printf("数组=%dn",sizeof(a1));printf("数组=%dn",sizeof("ab"));printf("结构体=%dn",sizeof(S1));printf("联合类型=%dn",sizeof(u)); gcc 64-bit 编译器,指针=8;
gcc 32-bit 编译器,指针=4


类的sizeof 面试中遇到面试官让我求一个类的sizeof,里边有各种类型的变量,还有虚函数(但是不懂什么是虚函数)。如果有虚函数就要加上一个指向虚表的指针,4字节大小(32 位 编译器),64位编译器是8字节大小。 1、空类
class A{}; sizeof(A)=1;
求sizeof的结果是1,因为即使是没有成员之类的,一个类存在,至少都要给他一个空间,不然就没有存在的意义了。
2、简单的类 class A{int a; double b;}; 本来sizeof(A.a)+sizeof(A.b)=12;结果=16,说明类的大小也遵守类似struct字节对齐的补齐规则,补齐为double类型8字节,所有为16
3、含虚函数的类 class A{int a;virtual fun();}; //sizeof(A)=8+8=16   (gcc-64bit编译器,指针大小为8字节)+补齐规则
//sizeof(A)=4+4=8   (gcc-32bit编译器,指针大小为4字节)
3、子类继承父类,含虚函数
class Base{public:Base(); virtual ~Base(); //每个实例都有虚函数表void set_num(int num) //普通成员函数,为各实例公有,不归入sizeof统计{a=num;}private: int a; //占4字节 char *p; //4字节指针};class Derive:public Base{public:Derive():Base(){}; ~Derive(){};private:static int st; //非实例独占 int d; //占4字节 char *p; //4字节指针}; gcc-32bit编译器
sizeof(Base)=12;
sizeof(Derive)=20
sizeof(Derive)=sizeof(Base)+sizeof(Derive.d)+sizeof(Derive.p) 的指针即可;
gcc-64bit编译器
sizeof(Base)=24; //补齐规则
sizeof(Derive)=40
sizeof(Derive)=sizeof(Base)+sizeof(Derive.d)+sizeof(Derive.p) 因为普通继承,子类和父类的虚函数存放在同一个虚表中,所以,只需要存一个指向虚表
4.子类虚继承、父类含虚函数
class Base{public:Base(); virtual ~Base(); //每个实例都有虚函数表void set_num(int num) //普通成员函数,为各实例公有,不归入sizeof统计{a=num;}private: int a; //占4字节 char *p; //4字节指针};class Derive:virtual public Base{public:Derive():Base(){}; ~Derive(){};private:static int st; //非实例独占 int d; //占4字节 char *p; //4字节指针};
sizeof(Derive)=sizeof(Base)+虚函数指针(指示父类存放空间的起始偏移量)+sizeof(Derive.d)+sizeof(Derive.p)
虚继承时,父类和子类的虚函数表分开放,所以,分别存储两个指向对应续表的指针,因而不用减去sizeof(A)中续表指针的大小。

类的sizeof总结: 1.类的大小为类的非静态成员数据的类型大小之和,也就是说静态成员数据不作考虑。
2.普通成员函数与sizeof无关。
3.虚函数由于要维护在虚函数表,所以要占据一个指针大小字节。
4.类的总大小也遵守类似struct字节对齐的,调整规则。

参考:http://blog.csdn.net/hairetz/article/details/4171769 http://blog.sina.com.cn/s/blog_728161840100u2ib.html


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。