精华内容
下载资源
问答
  • c++ 地址
    千次阅读 热门讨论
    2017-09-24 21:55:10

    今天一起讲自考,一说到地址和地址值就蒙圈了。

    更多相关内容
  • C++ 获取内存地址(取值运算符)

    千次阅读 2021-07-21 13:36:34
    c++ 获取内存地址使用取值运算符 : & 下面看下& 的使用 #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:21
    C++中,实例化一个对象,表示请求编译器分配一块固定大小的内存,大小为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++地址转换为字符串

    千次阅读 2019-05-29 11:05:50
    C++地址转换为字符串 有时候在做程序设计的时候,有可能需要做一个类似messageBus的功能,并且需要一个key保证唯一,那么如何实现这个key的唯一呢?大致两种思路: 使用函数签名,因为messagebus绑定的是一个函数...

    C++将地址转换为字符串

    有时候在做程序设计的时候,有可能需要做一个类似messageBus的功能,并且需要一个key保证唯一,那么如何实现这个key的唯一呢?大致两种思路:

    • 使用函数签名,因为messagebus绑定的是一个函数,并且对应一个topic,但是为了能够自适应各式各样的函数,就需要模板和元编程来解决,但是这样的局限很大,有一些函数我们是无法获取签名的(你一定会需要的);
    • 使用函数地址,这种方式是相对最方便的,由于函数地址是唯一的,这样我们就可以生成唯一的key,但是难就难在如何获取函数地址,并且转换成字符串。

    案例

    class TestMsg
    {
    public:
    
        void test()
        {
            std::cout << "test class no const test " << std::endl;
        }
    
        void test1()
        {
            std::cout << "test class no const test1" << std::endl;
        }
    };
    

    测试

    TestMsg msg;
    vector<TestMsg> tests;
    
    size_t cnt = 1000000;
    tests.resize(cnt);
    
    for( size_t i = 0; i < cnt; ++i )
    {
        tests[i] = TestMsg();
    }
    auto fp = &TestMsg::test;
    
    auto start = std::chrono::steady_clock::now();
    
    for( size_t i = 0; i < cnt; ++i )
    {
        void* ss = reinterpret_cast<void*>(&fp);
        std::stringstream ss1;
        ss1 << ss << &tests[i];
        std::string name = ss1.str();
    }
    
    auto end = std::chrono::steady_clock::now();
    std::cout << std::chrono::duration<double, std::milli>(end -start).count() << " ms" << std::endl;
    
    

    主要转换是通过stringstream这个类,使用它的前提是转换成void *类型。

    展开全文
  • C++读某个内存地址对应的值

    千次阅读 2020-09-04 17:06:19
    C++读某个内存地址对应的值 举个栗子,这里的内存地址对应的是int类型,读取时候需要将地址,转化为int类型的指针,然后用*运算符取得该地址对应的值。 0x61fe08为我想要读的内存地址,代码如下: int result=*(int ...
  • C++程序运行时的内存与地址

    千次阅读 2022-03-15 17:24:13
    本文全部内容,以SSD6的Exercise1为示例。 代码如下图。 #include <stdio.h> #include <stdlib.h> #include <... 0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F, ... 0x63636363, 0x63636363
  • C++获取成员变量的偏移地址

    千次阅读 2020-12-13 10:39:53
    2、那么接下来&((A*)0)->m_i1就代表m_i1从0x00000000这块内存开始的所在的地址空间,因为他的起始地址是0,那么&((A*)0)->m_i1也就代表了m_i1在类对象内的偏移地址,当对象的首地址为0时,得到的成员变量地址就是它...
  • C++数组地址偏移

    千次阅读 2017-07-19 06:34:26
    C++中数组名可以作为数组的首地址使用。数组名是一个右值,不能对其进行自增或者自减处理,但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移,而偏移的单位可能是数组中元素...
  • c/c++两个指针变量地址的相减

    千次阅读 2019-01-11 21:37:28
       c、c++两个指针变量的相减,需要注意两个变量的数据类型。   如下例程: #include "stdio.h" #include "string.h" using namespace std; #define uint8_t unsigned char #define uint16...
  • C/C++ 往指定地址读写的三种方式

    千次阅读 2020-09-14 14:50:12
    嵌入式编程中免不了要往指定地址读/写数据,如配置各种外设时需要写外设的寄存器,下面我总结了三...C/C++的强制转换是一个非常重要的知识点,学好了可以为你的编程带来很大的方便,以上就是使用强制转换将数字0x40...
  • C++中的取地址与解引用

    千次阅读 2020-02-10 21:08:27
    *的作用是引用指针指向的变量值,“解”就是把该地址对应的东西解开,解出来,就像打开一个包裹一样,那就是该变量的值了,所以称为“解引用”。也就是说,解引用是返回内存地址中对应的对象。 通俗的来讲,*的作用...
  • 传值 参数传进来之后只是一个局部变量,修改形参的值不会改变实参的值,也就是在函数里面改变该参数并不会改变主函数里面该变量的值。 #include<...传进来的是一个地址,通过这个地址可以找到该地址存放的
  • C++ 给指定地址分配内存并赋值

    千次阅读 2019-06-11 09:47:30
    最近涉及到一个问题,已知PVOID指针指向的地址,目的是对这个地址分配内存并赋值,涉及到指针的分配内存和指针移动的操作,具体代码如下: #include <iostream> #include <new> #include <Windows....
  • c++ 对指针地址的内容进行复制

    千次阅读 2020-05-13 00:23:26
    1、对指针地址的内容进行复制,地址不变,里面内容发生变化; 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; }
  • 修改指针地址:一般可直接将指针赋值为目标类的地址 void* pointtodefine=new MyClass(); 通过函数修改指针指向的地址 有些场景需要通过函数修改指针pointtodefine,使其指向自定义的类MyClass。(例如,仅函数为...
  • 关于C++中的指针和地址的理解(彻底)

    千次阅读 多人点赞 2018-08-07 16:16:41
    指针是一个变量,用来存储某一个值的地址,而不是值本身!!!因此,指针名表示的是地址,而不是值!!那么如何找到常规变量的地址,只需使用地址运算符(&amp;);比如name是一个变量,那么&amp;name就是他...
  • C/C++获取系统IP地址

    千次阅读 2022-02-19 16:46:12
    说明:使用该封装的函数,必须保证/etc/hosts下有主机名和IP的对应关系,否则会失败。 封装 #include <unistd.h> #include <netdb.h> #include <stdio.h> #include <... c
  • 【C/C++】关于计算机内存地址的理解

    千次阅读 2019-05-22 12:53:01
    经常可以看到某些书籍上写的内存地址0x0001,在另外一些书籍上写的内存地址又变成了0x00000001。都是表示的编号为1的内存地址,为什么一个是4位16进制表示,另外一个又是用8位16进制表示呢 根据不同的硬件环境来的。...
  • 输入整数显示ASCII字符(c++

    千次阅读 2022-03-17 18:25:06
    编写C++程序,输入一个0-127之间的整数,显示对应的ASCII字符。‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬...
  • C++虚表地址和虚函数地址

    千次阅读 2019-04-12 20:17:44
    C++虚表地址和虚函数地址 虚函数是c++实现多态性的一个重要知识点,本文主要解析虚函数在内存中的地址,以及与虚表地址的关系。 声明一个类,包含两个虚函数,一个普通成员函数和一个类成员。 调试程序,查看...
  • C++的offsetof函数用法

    千次阅读 2019-09-03 23:21:02
    1. C++内置的offsetof函数,能自动返回结构对象中,某变量距离结构体对象首地址的偏移值: offsetof(s, m); 它的第一个参数是一个结构体,第二个参数是这个结构体中变量的名字。这个宏会返回那个变量距结构体头部的...
  • C++如何打印类成员函数的地址

    千次阅读 2021-06-23 14:42:12
    C++如何打印类成员函数的地址
  • C++ 中如何输出函数的地址

    千次阅读 2021-03-08 21:40:08
    C++ 中如何输出函数的地址 #include <iostream> void hello() { } int main(int argc, char *argv[]) { std::cout << hello << std::endl; std::cout << &hello << std::...
  • c++路径拼接

    千次阅读 2019-06-18 17:02:27
    需求:argv传入一个参数,string类型,需要与其他的string拼接成完整路径,且不改变传入的参数的值 strcat(a,b) 连接连个char*变量,但是会改变a的值,如果后面还要用a的原值会不方便 使用string类型的+=直接拼接...
  • C++里数组名+1和数组名的地址+1的区别

    万次阅读 多人点赞 2017-12-28 10:25:20
    数组名的地址+1,是+整个数组大小的字节数 ②指针+1,是+指针类型对应字节数;指针的地址+1,是+8 ------------------------------------------------------------------------------------------------------------...
  • IP地址转换(C++)

    千次阅读 2020-04-14 21:20:48
    一.IP地址转换1 题目详情 编写程序,将十进制IP地址转换为二进制IP地址。 例如输入:202.117.0.20,输出:11001010011101010000000000010100 输入格式: 字符串形式的十进制点分IP地址。 输出格式: 字符串...
  • 终于搞清楚了这个问题。...比如是地址0x2222, 想得到0x2222所对应的地址的值,C里面是这样的: int data = *(uint64_t *) 0x2222; 如果是32位地址,则应该是这样写: int data = *(uint32_t *)0x2222;
  • Dev C++下载地址和安装教程(图解)

    千次阅读 2022-01-07 12:25:04
    Dev C++下载地址和安装教程(图解) Dev C++ 是一款免费开源的 C/C++ IDE,内嵌 GCC 编译器(GCC 编译器的 Windows 移植版),是 NOI、NOIP 等比赛的指定工具。Dev C++ 的优点是体积小(只有几十兆)、安装卸载方便...
  • C++内存逻辑二:指针地址

    千次阅读 2021-01-25 11:28:13
    指针创建和删除后的地址详解

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 747,182
精华内容 298,872
关键字:

c++ 地址

c++ 订阅