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


    关于结构体和C++类的内存地址问题
     
    今天终于有时间写点东西了~ 太爽了  *_*
     
    很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。
     
    类分为成员变量和成员函数,我们先来讨论成员变量。
     
    一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题:
     
    //类的定义
    class K{
    public:
     K(){k = 12;}
     ~K(){}
     int k;
    };
     
    //类的使用
    //...
     K kTemp;
     printf("%d--%d ",&kTemp,&kTemp.k);
     printf("%d--%d ",sizeof(K),sizeof(kTemp.k));
     int *i = (int*)(&kTemp);
     int w = *i;
     printf("%d ",w);
     
    运行上面的代码,结果如下:
    1310588--1310588
    4--4
    12
    很明显,类的内存大小和其唯一的成员变量的内存大小是一致的。内存地址也是一致的。
    他们甚至可以相互转换。换成结构体结果也是一样。网友可以自己运行上面代码来进行确认。
     
    这个时候,可能有人会提出疑问了。那么成员函数又如何?上面得代码就好像类没有任何成员函数一样,根本说明不了问题。
     
    呵呵,所有的函数都是存放在代码区的,不管是全局函数,还是成员函数。
    要是成员函数占用类的对象空间,那么将是多么可怕的事情:定义一次类对象就有成员函数占用一段空间。
     
    我们再来补充一下静态成员函数的存放问题吧:
    静态成员函数与一般成员函数的唯一区别就是没有this指针,因此不能访问非静态数据成员,就像我前面提到的,所有函数都存放在代码区,静态函数也不例外。所有有人一看到 static 这个单词就主观的认为是存放在全局数据区,那是不对的。(当然正在看我博客的网友应该不至于犯这样的问题,但是林子大了什么鸟都有嘛,我在这里多写两句,希望各位网友不要嫌我啰嗦哦)
     
    原创,请转帖者附上下面网址
  • 相关阅读:
    使用自己的key对app进行签名
    pl/sql中文乱码解决办法
    Oracle存储过程中创建表的权限
    pl/sql中获得sql语句执行后影响的行数
    申请Android Map APIKey
    vs快捷键
    ODAC安装配置与使用详解
    .net不安装Oracle11g客户端直接使用ODAC
    android通过USB使用真机调试程序
    pl/sql中实现字符串分割
  • 原文地址:https://www.cnblogs.com/lidabo/p/3434859.html
Copyright © 2020-2023  润新知