-
2017-09-24 21:55:10
今天一起讲自考,一说到地址和地址值就蒙圈了。
更多相关内容 -
C++ 获取内存地址(取值运算符)
2021-07-21 13:36:34c++ 获取内存地址使用取值运算符 : & 下面看下& 的使用 #include <iostream> using namespace std; int main() { string var1 = "c++"; int var2 = 10086; cout << "var1 变量的地址: ";...c++ 获取内存地址使用取值运算符 : &
下面看下& 的使用
#include <iostream> using namespace std; int main() { string var1 = "c++"; int var2 = 10086; cout << "var1 变量的地址: "; cout << &var1 << endl; cout << "var2 变量的地址: "; cout << &var2 << endl; };
打印结果:
-
C++ 对象地址解析
2020-08-25 18:31:21C++中,实例化一个对象,表示请求编译器分配一块固定大小的内存,大小为sizeof(object),那么问题来了,这个对象的地址&object是什么呢? 从6个方面考虑对象地址: 1、普通类class中包含了成员函数和成员变量...C++中,实例化一个对象,表示请求编译器分配一块固定大小的内存,大小为sizeof(object),那么问题来了,这个对象的地址&object是什么呢?
以下从6个方面考虑对象地址,测试环境:gcc编译器
1、普通类class中包含了成员函数和成员变量,对象object的地址即为该对象内所包含的第一个字段的地址。
这个没啥好说的,类似于数组地址与数组首元素地址、结构体变量的地址与其第一个字段的地址。#include <iostream> #include <string> using namespace std; class Person { public: Person(string Name = "Tom", int Age = 10) /*缺省的default ctor*/ :name(Name),age(Age) {} void getAddr() const { cout << "object's this addr: " << this << endl; cout << "object's first elem: " << &(this->name) << endl; } private: string name; int age; }; int main() { Person p; cout << "The object addr: " << &p << endl; p.getAddr(); //cout << "hello...\n"; return 0; }
执行结果: 对象p的地址就是对象p内首个字段name的地址。
XXX:~/Exercise$ g++ objectAddr.cpp XXX:~/Exercise$ ./a.out The object addr : 0x7fffe857ac40 object's this addr: 0x7fffe857ac40 object's first elem: 0x7fffe857ac40
2、那若是类class为空呢,类中什么都没有,那么一个空的类实例化一个对象object,此时对象大小等于几?它的地址又是什么呢?
逻辑上对象的大小等于0,但实际情况下它等于1,因为C++裁定凡是独立对象必须有非零大小,既然有大小就说明编译器分配了内存,有了内存肯定就有地址啦,如下:#include <iostream> #include <string> using namespace std; class Student {}; int main() { Student s; cout << "The object size : " << sizeof(s) << endl; /* sizeof(Student)也等于1 */ cout << "The object addr : " << &s << endl; return 0; }
执行结果:可以看到对象s大小为1,这是因为编译器为空对象内强行安插了一个char,所以s大小为1,(《Effective C++》条例39),而对象地址应该就是这个char的地址。
XXX:~/Exercise$ g++ objectAddr.cpp XXX:~/Exercise$ ./a.out The object size : 1 The object addr : 0x7ffd7e04dbbf
3、若一个类中包含了virtual虚函数,那么具现出一个实体object的地址是什么呢,此时应该是虚指针vptr的地址。
带有虚函数的类中,编译期间,在每一个class object中,一个额外的虚指针vptr会被编译器合成出来放在对象的开头,内含相关虚表vtbl的地址。#include <iostream> #include <string> using namespace std; class Person { public: Person(string Name = "Tom", int Age = 10) :name(Name),age(Age) {} virtual ~Person() {} void getAddr() const { cout << "object's this addr: " << this << endl; cout << "object's first elem: " << &(this->name) << endl; cout << "object's second elem:" << &(this->age) << endl; } private: string name; int age; }; int main() { Person p; cout << "The object addr : " << &p << endl; p.getAddr(); //cout << "hello...\n"; return 0; }
执行结果:可以看出对象p的地址与p内首个字段name的地址不一样了,&p是对象内虚指针的地址,该地址向后偏移才是首个字段name的地址。(参考《Inside The C++ Object Model》)
XXX:~/Exercise$ g++ objectAddr.cpp XXX:~/Exercise$ ./a.out The object addr : 0x7fffddf9e860 object's this addr: 0x7fffddf9e860 object's first elem: 0x7fffddf9e868 object's second elem:0x7fffddf9e870
这里第一个字段name的地址与第二个字段age的地址相差8,为什么呢?因为string内有一根指针,在gcc编译器中,指针占8个字节。
4、若是在继承体系中,一个派生类对象的地址会是什么?
派生类对象object的组成包含了基类的成员变量和派生类自己新增的成员变量,该对象的地址是派生类对象中所包含的基类成员中的首个字段的地址,而不是派生类自己新增的第一个字段成员的地址。#include <iostream> #include <string> using namespace std; class Person { public: Person(string Name = "Tom", int Age = 10) :name(Name),age(Age) {} protected: string name; int age; }; class Student : public Person { public: Student(string Name = "Tom", int Age = 10, int Grade = 100) :Person(Name,Age),grade(Grade) {} void getAddr() const { cout << "object's this addr: " << this << endl; cout << "object's first elem: " << &(this->name) << endl; cout << "object's second elem:" << &(this->age) << endl; cout << "object's third elem: " << &(this->grade) << endl; } private: int grade; }; int main() { Student s; cout << "The object addr : " << &s << endl; s.getAddr(); //cout << "hello...\n"; return 0; }
执行结果:对象s的地址即为对象s中首个字段name的地址,这里注意新增字段grade的地址,可以看出三个成员变量所占内存是连续的,但在一个对象中,继承自基类的部分和派生类自定义的部分不一定是连续存储的。(《C++ Primer》15.2.2)
XXX:~/Exercise$ g++ objectAddr.cpp XXX:~/Exercise$ ./a.out The object addr : 0x7ffe6b3f5be0 object's this addr: 0x7ffe6b3f5be0 object's first elem: 0x7ffe6b3f5be0 object's second elem:0x7ffe6b3f5be8 object's third elem: 0x7ffe6b3f5bec
5、若在继承体系中加入了虚函数,派生类对象的地址又是什么?
该地址是派生类对象object虚指针vptr的地址。#include <iostream> #include <string> using namespace std; class Person { public: Person(string Name = "Tom", int Age = 10) :name(Name),age(Age) {} virtual ~Person() {} protected: string name; int age; }; class Student : public Person { public: Student(string Name = "Tom", int Age = 10, int Grade = 100) :Person(Name,Age),grade(Grade) {} virtual ~Student() {} void getAddr() const { cout << "object's this addr: " << this << endl; cout << "object's first elem: " << &(this->name) << endl; cout << "object's second elem:" << &(this->age) << endl; cout << "object's third elem: " << &(this->grade) << endl; } private: int grade; }; int main() { Student s; cout << "The object addr : " << &s << endl; s.getAddr(); //cout << "hello...\n"; return 0; }
执行结果:此时对象s的地址是虚指针vptr的地址,与第三个差不多,但是这个虚指针vptr是派生类对象自己的,而不属于派生类对象包含的基类成员的那部分,
若是具现一个Person实体 Person p; 这里p的地址才是基类对象自己的专属的虚指针的地址,多态性的体现正是靠这根虚指针vptr。
用一句话表示多态性: (*(this->vptr)[n])(this)XXX:~/Exercise$ g++ objectAddr.cpp XXX:~/Exercise$ ./a.out The object addr : 0x7ffe61d5fbd0 object's this addr: 0x7ffe61d5fbd0 object's first elem: 0x7ffe61d5fbd8 object's second elem:0x7ffe61d5fbe0 object's third elem: 0x7ffe61d5fbe4
6、继承抽象基类的派生对象地址?
这个地址肯定就是派生类对象object自己的虚指针vptr的地址,因抽象基类不可具现实体。7、若类中包含静态成员变量,该静态成员变量是属于类的,其存储在进程空间中的全局区,由该类的所有对象共享,静态成员变量不存储在对象本身占用的空间内。
注:对象内存大小组成如下:
(1)基本字段(成员变量);
(2)对齐;
(3)由vritual带来的额外的负担,例如虚指针vptr。
若有说错的,请走过路过的大佬们给个建议,谢谢。
-
C++读某个内存地址对应的值
2020-09-04 17:06:19C++读某个内存地址对应的值 举个栗子,这里的内存地址对应的是int类型,读取时候需要将地址,转化为int类型的指针,然后用*运算符取得该地址对应的值。 0x61fe08为我想要读的内存地址,代码如下: int result=*(int ... -
C++将地址转换为字符串
2019-05-29 11:05:50C++将地址转换为字符串 有时候在做程序设计的时候,有可能需要做一个类似messageBus的功能,并且需要一个key保证唯一,那么如何实现这个key的唯一呢?大致两种思路: 使用函数签名,因为messagebus绑定的是一个函数... -
IP地址转换(C++)
2020-04-14 21:20:48一.IP地址转换1 题目详情 编写程序,将十进制IP地址转换为二进制IP地址。 例如输入:202.117.0.20,输出:11001010011101010000000000010100 输入格式: 字符串形式的十进制点分IP地址。 输出格式: 字符串... -
c/c++两个指针变量地址的相减
2019-01-11 21:37:28c、c++两个指针变量的相减,需要注意两个变量的数据类型。 如下例程: #include "stdio.h" #include "string.h" using namespace std; #define uint8_t unsigned char #define uint16... -
【C/C++】传值调用和传地址调用,一次就会
2021-08-31 09:56:231. 传值和传地址调用的本质 记住一句话:当函数接收到任何参数时,都会对参数本身做一次复制。 之所以会产生理解上的歧义,是因为混淆了指针和指针所指向的内容。 1. 传值调用: 很好理解,函数会新建一个变量,将... -
C/C++ 往指定地址读写的三种方式
2020-09-14 14:50:12嵌入式编程中免不了要往指定地址读/写数据,如配置各种外设时需要写外设的寄存器,下面我总结了三...C/C++的强制转换是一个非常重要的知识点,学好了可以为你的编程带来很大的方便,以上就是使用强制转换将数字0x40... -
C++中的取地址符(&)
2019-12-23 22:51:00这个符号特别容易混淆, 因为在C++中, &有两种不同用法: 获得变量地址 引用传递 第一个例子, int main() { std::string s = "Hello"; std::string*p = &s; std::cout << p << std::endl; ... -
c++内存地址以及如何访问
2016-11-19 17:09:14通过指针,可以简化一些c++编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的 每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了内存中的一个... -
C++中的取地址与解引用
2020-02-10 21:08:27*的作用是引用指针指向的变量值,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中对应的对象。 通俗的来讲,*的作用... -
C/C++++指针的地址、指针的值、指针所指向内容的值
2021-02-21 21:00:41主要辨析一下C/C++中指针相关常见概念。 首先理解指针所指向元素与指针,他的意思就相当于地图上你家的位置与你家里的实际情况。知道了**指针**(地图上的位置),就可以知道怎么去你家,但是无法知道你家中的具体... -
C++ 函数参数传递的三种方式 (传参、传地址、传引用)
2020-08-04 13:50:54传值 参数传进来之后只是一个局部变量,修改形参的值不会改变实参的值,也就是在函数里面改变该参数并不会改变主函数里面该变量的值。 #include<...传进来的是一个地址,通过这个地址可以找到该地址存放的 -
C++ 给指定地址分配内存并赋值
2019-06-11 09:47:30最近涉及到一个问题,已知PVOID指针指向的地址,目的是对这个地址分配内存并赋值,涉及到指针的分配内存和指针移动的操作,具体代码如下: #include <iostream> #include <new> #include <Windows.... -
记一次C++踩坑,for循环变量地址以及类的实例化
2019-03-05 17:28:36在做牛客网中这个题目时遇到了一个奇怪的现象,for循环中初始化对象一直是一个地址,所以链表被指的乱七八糟,造成死循环,在此记录 答案参考这位大神 #include<iostream> using namespace std; ... -
【C/C++】获取函数地址并调用
2018-07-19 16:39:02函数地址、函数指针 -
关于C++中vector数组的首地址问题
2018-03-20 18:39:55原文地址:http://www.cctry.com/thread-278452-1-1.html近期的几个项目用到了C++标准模板库STL中的vector容器,即:动态数组,感觉也挺方便好用,跟MFC中的CArray不相上下,而且还跨平台,还是非常不错的。... -
c++ 对指针地址的内容进行复制
2020-05-13 00:23:261、对指针地址的内容进行复制,地址不变,里面内容发生变化; sTempLanguage = &subtitleLang_; 将subtitleLang_地址给sTempLanguage, *sTempLanguage = [],因为*sTempLanguage是指针,指的是subtitleLang_... -
C++学习010-将某个地址转化为指针
2016-08-12 10:08:07如果需要将某个具体的地址转化为指针,可以直接使用类型那个转换来是实现。 实例如下 int main() { void* pData = (void*)(0x004001); std::cout ; std::getchar(); return 0; } -
【C++】类与对象(取地址操作符)
2019-02-25 18:01:092.取地址及const取地址操作符重载 1.1 const修饰类的成员函数 将const修饰的类成员函数称之为const成员函数,实际const修饰的是该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。 class... -
C++实现查询对方ip地址,确定真实地理位置!
2019-04-16 20:01:36那么要获得某台机器的IP地址并不是什么难事。一台机器可以装多块网卡,因此它就可能有多个IP地址。 目前很多发烧友的PC机都装有多块网卡。其中一块网卡与调制解调器(MODEM)或者ADSL适配器相连,另一块与家里... -
关于C++中的指针和地址的理解(彻底)
2018-08-07 16:16:41指针是一个变量,用来存储某一个值的地址,而不是值本身!!!因此,指针名表示的是地址,而不是值!!那么如何找到常规变量的地址,只需使用地址运算符(&);比如name是一个变量,那么&name就是他... -
C++,IP地址整数和字符串形式的互相转换方法
2018-07-19 14:30:43解析转换程序通信消息体中IP地址时,经常会将其在整数和字符串两种方式转换,于是将转换方式总结一下。 #include <iostream> #include <arpa/inet.h> #include <stdio.h>... -
黑马程序员最新24期C/C++全栈培训讲义 (附全套高清视频下载地址)
2019-04-28 11:36:5424期最新黑马程序员C/C++讲义,文档包括:C基础讲义 轻松搞定C++语言 STL基础教程 Linux基础教程 (附全套视频下载地址baiduyun分享) -
C/C++按值传递和按地址传递
2018-04-06 19:41:11C/C++的按值传递和按地址传递有明显不同,下面对他们作个区别:按值传递:在调用函数中将原函数的值拷贝一份过去被调用的函数,在被调用函数中对该值的修改不会影响原函数的值。按地址传递:在调用函数的时候将原... -
【C/C++】关于计算机内存地址的理解
2019-05-22 12:53:01经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢 根据不同的硬件环境来的。... -
C/C++获取系统IP地址
2022-02-19 16:46:12说明:使用该封装的函数,必须保证/etc/hosts下有主机名和IP的对应关系,否则会失败。 封装 #include <unistd.h> #include <netdb.h> #include <stdio.h> #include <... c -
C++虚表地址和虚函数地址
2019-04-12 20:17:44C++虚表地址和虚函数地址 虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系。 声明一个类,包含两个虚函数,一个普通成员函数和一个类成员。 调试程序,查看... -
C++常量转换
2020-04-22 10:13:08先看如下代码 const int * p = NULL;...newp中保存的地址和p中保存的地址完全一样,唯一区别是,newp不再是一个常量指针了。 常量转换,第二层含义是,将非常量转化为常量,具体代码如下 int * p...