关于结构体和C++类的内存地址问题

关于结构体和C++类的内存地址问题

 

今天终于有时间写点东西了~ 太爽了  *_*

 

很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。

 

类分为成员变量和成员函数,我们先来讨论成员变量。

 

一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题:

 

//类的定义

class K{
public:
 K(){k = 12;}
 ~K(){}
 int k;
};

 

//类的使用

//...

 K kTemp;
 printf("%d--%d\n",&kTemp,&kTemp.k);
 printf("%d--%d\n",sizeof(K),sizeof(kTemp.k));
 int *i = (int*)(&kTemp);
 int w = *i;
 printf("%d\n",w);

 

运行上面的代码,结果如下:

1310588--1310588
4--4
12

很明显,类的内存大小和其唯一的成员变量的内存大小是一致的。内存地址也是一致的。

他们甚至可以相互转换。换成结构体结果也是一样。网友可以自己运行上面代码来进行确认。

 

这个时候,可能有人会提出疑问了。那么成员函数又如何?上面得代码就好像类没有任何成员函数一样,根本说明不了问题。

 

呵呵,所有的函数都是存放在代码区的,不管是全局函数,还是成员函数。

要是成员函数占用类的对象空间,那么将是多么可怕的事情:定义一次类对象就有成员函数占用一段空间。

 

我们再来补充一下静态成员函数的存放问题吧:

静态成员函数与一般成员函数的唯一区别就是没有this指针,因此不能访问非静态数据成员,就像我前面提到的,所有函数都存放在代码区,静态函数也不例外。所有有人一看到 static 这个单词就主观的认为是存放在全局数据区,那是不对的。(当然正在看我博客的网友应该不至于犯这样的问题,但是林子大了什么鸟都有嘛,我在这里多写两句,希望各位网友不要嫌我啰嗦哦)

 

原创,请转帖者附上下面网址

http://blog.chinaunix.net/u3/102921/showart_2123414.html

时间: 2024-11-01 21:12:48

关于结构体和C++类的内存地址问题的相关文章

c++-用new申请了一个结构体数组,delete时内存错误

问题描述 用new申请了一个结构体数组,delete时内存错误 strong text //////////////////////////////////////CLOCK算法部分//////////////////void CLOCK(){ arr *page_t; int ijpointertimes=0flag=-1num=0;//pointer为查找位置 page_t=new arr[m];//==============================开始计算============

sk buff-sk_buff和ethhdr结构体中怎么获得源mac地址?并将类型转换

问题描述 sk_buff和ethhdr结构体中怎么获得源mac地址?并将类型转换 请教各位大神,写的这段代码功能没有实现,求指教! static size_t _format_mac_addr(char *buf, int buflen,const unsigned char *addr, int len)//mac地址转换函数,转为 aa:aa:aa:aa:aa:aa 这类 { int i; char *cp = buf; for (i = 0; i < len; i++) { cp += s

关于vb.net结构体(structure)在内存空间存储的问题

问题描述 <StructLayout(LayoutKind.Auto)>_PublicStructuredc_msg<VBFixedArray(IMEI_LEN+1)>PublicImeiDTU()AsByte<VBFixedArray(DTU_NAME+1)>PublicNameDTU()AsBytePublicmsg_typeAsBytePublicreservedAsBytePublicmsg_lenAsShort<VBFixedArray(MAX_MSG_

详解C语言的结构体中成员变量偏移问题_C 语言

c语言中关于结构体的位置偏移原则简单,但经常忘记,做点笔记以是个记忆的好办法 原则有三个: a.结构体中的所有成员其首地址偏移量必须为器数据类型长度的整数被,其中第一个成员的首地址偏移量为0, 例如,若第二个成员类型为int,则其首地址偏移量必须为4的倍数,否则就要"首部填充":以此类推 b.结构体所占的总字节数即sizeof()函数返回的值必须是最大成员的长度的整数倍,否则要进行"末尾填充": c.若结构体A将结构体B作为其成员,则结构体B存储的首地址的偏移量必须

【C/C++学院】0817-递归汉诺塔 双层递归 /CPP结构体 /面向过程与面向对象的编程模式/类的常识共用体实现一个类的特征/QT应用于类以及类的常识

递归汉诺塔 双层递归 #include <iostream> void han(int n, char A, char B, char C) { static int num = 1; std::cout << "第" << num << "次"; num++; if (n<1) { return; } else { han(n - 1, A, C, B); std::cout << A <&l

详解Swift语言中的类与结构体_Swift

类在 Swift 中类是建立灵活的构建块.类似于常量,变量和函数,用户可以定义的类的属性和方法.Swift给我们提供了声明类,而无需用户创建接口和实现文件的功能.Swift 允许我们创建类作为单个文件和外部接口,将默认在类一次初始化来创建. 使用类的好处: 继承获得一个类的属性到其他类 类型转换使用户能够在运行时检查类的类型 初始化器需要处理释放内存资源 引用计数允许类实例有一个以上的参考 类和结构的共同特征: 属性被定义为存储值 下标被定义为提供访问值 方法被初始化来改善功能 初始状态是由初始

Swift语法专题十——类和结构体

Swift讲解专题十--类与结构体 一.引言         Swift中的类与结构体十分相似,和Objective-C不同的是,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法.         Swift中的类与结构体有如下相似点: 1.定义属性来存储值. 2.定义函数来提供功能. 3.通过定义下标语法使用下标的方式取值. 4.定义构造方法来对其进行初始化. 5.通过扩展来在原始基础上添加功能. 6.通过协议来定义实现标准. 当然类和结构体也有许多不同点,下面这些功能是类独有

《从零开始学Swift》学习笔记(Day 30)——选择类还是结构体呢?

原创文章,欢迎转载.转载请注明:关东升的博客   类和结构体非常相似,很多情况下没有区别.如果你是设计人员在进行系统设计时候,是将某种类型设计成为类还是结构体?  类和结构体异同: 类和结构体都有如下功能: 定义存储属性 定义方法 定义下标 定义构造函数 定义扩展 实现协议  只有类才有的功能: 能够继承另外一个类 能够核对运行期对象的类型 析构对象释放资源 引用计数允许一个实例有多个引用  选择的原则: 结构体是值类型,每一个实例没有独一无二的标识,下面两个数组实例本质上没有区别,他们可以互相

Swift中的类class与结构体struct体学习笔记_Swift

一.引言Swift中的类与结构体十分相似,和Objective-C不同的事,Swift中的结构体不仅可以定义属性,也可以像类一样为其定义方法. Swift中的类与结构体有如下相似点: 1.定义属性来存储值. 2.定义函数来提供功能. 3.通过定义下标语法使用下标的方式取值. 4.定义构造方法来对其进行初始化. 5.通过扩展来在原始基础上添加功能. 6.通过协议来定义实现标准. 当然类和结构体也有许多不同点,下面这些功能是类独有的,结构体没有: 1.通过继承来创建类的子类. 2.在运行时允许对类的