关于结构体和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 这个单词就主观的认为是存放在全局数据区,那是不对的。(当然正在看我博客的网友应该不至于犯这样的问题,但是林子大了什么鸟都有嘛,我在这里多写两句,希望各位网友不要嫌我啰嗦哦)
 
原创,请转帖者附上下面网址

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

  1. OC基础--结构体 枚举做类成员属性

    结构体  枚举作类的成员属性: 定义一个学生类 性别 -- 枚举 生日 入学日期  毕业日期  --  结构体 代码示例: 声明文件 Student.h: #import <Foundation ...

  2. RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏(转)

    在使用OpenSSL的RSA加解密的时候,发现RSA_new()初始化和RSA_free()释放RSA结构体后依然会有内存泄漏.网上Baidu.Google之,发现这个相关信息很少(至少中文搜索结果是 ...

  3. 转载 C#结构体(struct)和类(class)的区别

    转载原地址: http://dotnet.9sssd.com/csbase/art/8 C#结构体和类的区别问题:在C#编程语言中,类属于引用类型的数据类型,结构体属于值类型的数据类型,这两种数据类型 ...

  4. C结构体、C++结构体、C++类的区别

    先来说说C和C++中结构体的不同 a) C语言中的结构体不能为空,否则会报错 1>d:\myproject\visual studio 2013\projects\myc++\main.c(71 ...

  5. 49.大量qq号及qq密码挖掘到结构体并实现精确分配内存以及快速排序

    原数据: 处理后的数据: 完整代码: //思路; //数据清洗(把空格替换成'\0') -> 精确获取每一行(要提前获取source的总长度) -> 获取出每一行再精确分割并把分割后的数据 ...

  6. Foudation框架之一些常用结构体和常用类

    表示范围作用的结构体:NSRange:       有三种方式创建新的NSRange: 1.NSRange range:            range.location = 17;         ...

  7. C++模板学习:函数模板、结构体模板、类模板

    C++模板:函数.结构体.类 模板实现 1.前言:(知道有模板这回事的童鞋请忽视) 普通函数.函数重载.模板函数 认识. //学过c的童鞋们一定都写过函数sum吧,当时是这样写的: int sum(i ...

  8. swift 第十一课 结构体定义model类

    结构体是可以作为 model 类使用的不过也要 写下的创建方法 import UIKit/***创建一个model 结构,重写init 方法,结构体的属性不能出现可选类型**/ struct Mode ...

  9. Linux 网络编程详解一(IP套接字结构体、网络字节序,地址转换函数)

    IPv4套接字地址结构 struct sockaddr_in { uint8_t sinlen;(4个字节) sa_family_t sin_family;(4个字节) in_port_t sin_p ...

随机推荐

  1. leetcode Merge Two Sorted Lists python

    # Definition for singly-linked list. # class ListNode(object): # def __init__(self, x): # self.val = ...

  2. genToken- Php file

    <?php public function genToken($len = 32, $md5 = true) { # Seed random number generator # Only ne ...

  3. Continue

    Continue 其作用为结束本次循环.即跳出循环体中下面尚未执行的语句. 对于while循环,继续求解循环条件. 对于for循环程序流程接着求解for语句头中的第三个部分expression表达式. ...

  4. Top free and open source log management software

    As mentioned in the previous post, in my quest to find an alternative to Kiwi Syslog, I looked at a ...

  5. 转 批处理 %~dp0的意义

    http://nealcai.iteye.com/blog/1685192 http://blog.csdn.net/caz28/article/details/7448677 http://stac ...

  6. IE添加信任站点并设置允许ActiveX控件的VBS脚本

    Set objFSO = CreateObject("Scripting.FileSystemObject") Set WSHShell = CreateObject(" ...

  7. 圣何塞与 Microsoft 宣布该市为超过 5,000 名市府公务员选择 Office 365、Windows Azure 和 StorSimple

    过去几个月来我们展示了极大的客户吸引力,今天我们非常高兴地宣布,我们又赢得了一位新客户,且他们利用 Microsoft 革新 IT 的方式非常有趣. 今天,我们非常高兴地告诉大家,圣何塞市选择了 Mi ...

  8. 关于使用WKWebViewJavascriptBridge报错的问题

    Error message: Undefined symbols for architecture arm64: "_OBJC_CLASS_$_WKWebViewJavascriptBrid ...

  9. HTML之学习笔记(九)表单

    html的表单标签是一个系列,用开闭的<form>标签包裹起来的组合.表单的作用是将我们要向服务器提交数据的数据包含起来,然后提交到服务器处理.(使用表单是浏览器提交客户端数据到服务端的方 ...

  10. 性能优化工具---iostat

    Iostat (参考 man iostat) 可选项: -c为汇报CPU的使用情况: -d为汇报磁盘的使用情况: -k表示每秒按kilobytes字节显示数据: -t为打印汇报的时间: -v表示打印出 ...