精华内容
下载资源
问答
  • 多重继承下,不同基类指针指向同一子类对象的地址问题——腾讯一笔试题  2 原文:http://www.haogongju.net/art/1694028 多继承时,父类指针指向子类对象时,父类指向的不是子类开始地址,而是子类...

    原文:http://www.haogongju.net/art/1694028

    多继承时,父类指针指向子类对象时,父类指向的不是子类开始地址,而是子类中对应父类的结构的类对象的基地址,所以,当多个父类指向同一个子类时,父类的指针值其实是不一样的。


    5.观察下面一段代码: 
    class ClassA 

    public: 
    virtual ~ ClassA(){}; 
    virtual void FunctionA(){}; 
    }; 


    class ClassB 

    public: 
       virtual void FunctionB(){}; 
    }; 


    class ClassC : public ClassA,public ClassB 

    public: 
    }; 
      
    ClassC aObject; 
    ClassA* pA=&aObject; 
    ClassB* pB=&aObject; 
    ClassC* pC=&aObject; 


    关于pA,pB,pC的取值,下面的描述中正确的是: 
    A.pA,pB,pC的取值相同.               B.pC=pA+pB 
    C.pA和pB不相同                      D.pC不等于pA也不等于pB


    这个是多重继承的问题。在《Thinking in C++》第二卷的363页看到重复子对象这部分的内容,明白了怎么回事。

    以上两个基类均含有虚函数,故其大小至少有一个虚函数表的指针大小,结构大概是这样的:


    ClassA类数据成员
    ClassB类数据成员
    ClassC类其他数据成员

    可以看出对象aObject以ClassA子对象开头,然后是ClassB子对象部分,最后的部分来自ClassC类本身。ClassC的对象既是一个ClassA也是一个ClassB。

    故aObject可以向上类型转换到两者中任何一个基类型。


    当向上类型转换为ClassA时,结果指针指向ClassA子对象部分,刚好在ClassC对象的开始位置,所以地址pA和pC是相同的。

    当向上类型转换到ClassB时,结果指针必须指向ClassB子对象所在的实际位置,因为类ClassB并不知道有关ClassC的事情。

    所以上题的答案应为C。


    但是这个地方有个好玩的现象:

    如果添加如下代码:cout<<"pC==pB?"<<boolalpha<<(pC==pB)<<endl;

    则返回值永远都是true,尽管他们的地址输出的时候并不相同。因为pC在pC==pB的过程中被隐式转换为ClassB*,以使得比较有意义。




    基类子类在内存中的存储

    class a 
    {

    public: 
    int aa

    }; 


    class b:public a 
    {

    public: 
    int bb; 

    从内存的来看 
    如a 
    ---------| 
    |占一个int数据大小--| 
    |----(aa数据)------| 
    |--------- 
    而b则是 
    ---------|--------- 
    |占一个int数据大小--|占一个Int数据大小--| 
    |从a中继承而来------|---(bb数据----------| 
    |------------------ 
    当定义一个基类类型的指针时 
    a *p;这时,这个指针指向的是a类型的数据 
    当p指针指向派生类的时候,因为p是a类型的指针,所以*p只解释为a类型数据的长度,即 
    ————————-|--------- 
    |占一个int数据大小--|占一个Int数据大小--| 
    |从a中继承而来------|-----(bb数据)-------| 
    |------------------ 
    |------------|------------| 
    |-p只指向这个区域_--| 

    因此,当基类的指针(P)指向派生类的时候,只能操作派生类中从基类中继承过来的数据。 
    指向派生类的指针,因为内存空间比基类长,会导致严重了后果,所以不允许派生类的指针指向基类。而基类的指针可以指向派生类。 

    C++的多态性能解决基类指针不能操作派生类的数据成员的问题。

     

    用C++比较好说明白:       
      1:指针的可访问性是由指针的定义决定的,比如说用BaseClass定义的指针,可访问的范围就是BaseClass的内存区域       
      2:允许用一个指向基类的指针指向派生类,由于被指向的对象的内存空间大于指针的可访问空间,所以这种向上映射是安全的       
      3:对象在调用虚函数的时候,是调用父类的函数还是调用派生类的函数,是和对象的类型有关的,比如说一个派生类B,其父类是A,则B的对象调用父类中被声明为VIRTUAL的函数时,被B   所OVERRIDE的函数调用的是B里的函数,而B没有OVERRIDE的函数调用的是基类里的函数 

    展开全文
  • 5、6、7、8是字面值常量,存放在代码区,是不能修改的,“abc”本身就是一个地址,然后你在栈区定义了四个指针都是指向同一个地址指针比较的时候比较的是指针存放的地址,而不是指针本身的地址,当然5、6、...
    代码如下:

    #include <iostream>
    using namespace std;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
     
        char str1[] = "abc";
        char str2[] = "abc";
        const char str3[] = "abc";
        const char str4[] = "abc";
     
        const char * str5 = "abc";
        const char * str6 = "abc";
     
        char * str7 = "abc";
        char * str8 = "abc";
     
        cout<<boolalpha<<(str1 == str2) <<endl; //false
        cout<<boolalpha<<(str3 == str4) <<endl;//false
        cout<<boolalpha<<(str5 == str6) <<endl;//true
        cout<<boolalpha<<(str7 == str8) <<endl;//true
     
        
        return 0;
    }

    原因:

    5、6、7、8是字面值常量,存放在代码区,是不能修改的,“abc”本身就是一个地址,然后你在栈区定义了四个指针都是指向同一个地址,
    指针比较的时候比较的是指针存放的地址,而不是指针本身的地址,当然5、6、7、8都是一样的值。
    同时字符数组呢,是存在栈区,四个数组变量,每个变量比较的都是数组的首地址,四个不同的变量当然地址不一样啊。


    展开全文
  • 看数据结构看到循环链表的合并,很奇怪为什么最后要free掉p,这样rearB->next不就会随机指向其他的内存了吗![图片说明](https://img-ask.csdn.net/upload/201708/16/1502850283_66326.png)
  • 1,智能指针 2,在使用时,进行地址判断是否指向同一地址

    1,智能指针

    2,在使用时,进行地址判断是否指向同一地址。

    展开全文
  • resultImageToDisp,在主函数里面有个局部变量IplImage* resultImage,我需要将resultImageToDisp赋值给resultImage,但只是浅拷贝,就是说resultImageToDisp和resultImag两个图像指针指向同一内存,主函数结束时按...

    1,问题

      写代码的时候遇到一个问题,在方法类里面有个成员变量IplImage* resultImageToDisp,在主函数里面有个局部变量IplImage* resultImage,我需要将resultImageToDisp赋值给resultImage,但只是浅拷贝,就是说resultImageToDisp和resultImag两个图像指针指向了同一内存,主函数结束时按惯例使用cvReleaseImage(&resultImage),但是在退出函数体时候调用方法类的析构函数,此析构函数也存在一个cvReleaseImage(&resultImageToDisp),这样就造成同一内存释放两次报错。本来简单以为在析构时添加一个if(resutlImageToDisp!=NULL)判断语句就可以解决问题,可是还是报错。那么问题来了,NULL的作用是什么,此处添加什么判断语句可以解决问题?

    2,抽象

    char *c1,*c2;
    c1=new char[10];
    c2=c1;
    delete c1;
    if(/*    c2指向的内存空间没有被释放    */)
    {
    delete c2;
    }

      该问题抽象成以上一段代码,即寻找if判断语句。

    3,思路

      首先,我想到的是判断指针是否为NULL。由于没能真正理解NULL的作用,想当然认为判断指针是否为NULL,就是判断该指针指向的内存是否为0,这是错误的理解。经过测试,我对同一指针加上NULL判断可以通过,如以下代码。

    if (ROIImageUnsmoothed!=NULL)
    {
       cvReleaseImage(&ROIImageUnsmoothed);
    }
    if (ROIImageUnsmoothed!=NULL)
    {
       cvReleaseImage(&ROIImageUnsmoothed);
    }

      

    resultImage=resultImageToDisp;
    cvReleaseImage(&resultImage);
    if (resultImageToDisp!=NULL)
    {
        cvReleaseImage(&resultImageToDisp);
    }

     

      第一次if成立,第二次不成立,代码完全没问题。而对于双指针指向同一内存却报错,说明,NULL只是判断指针本身,而不是它的内存。

      查阅资料才明白,释放内存,如free(),deleate(),只是做了一件事情:斩断指针变量与这块内存的关系。(我觉得应该是将这块内存交还给系统,不再供程序使用)free函数就是把这块内存和指针之间的所有关系斩断。从此指针和那块内存之间再无瓜葛。至于指针变量本身保存的地址并没有改变,但是它对这个地址处的那块内存却已经没有所有权了。那块被释放的内存里面保存的值也没有改变,只是再也没有办法使用了。更斩草除根的办法是释放后马上悬空地址,即将指针置为NULL:将指针保存的地址清除,使其不指向任何内存。

      这样可以解释,opencv的cvReleaseImage函数,一定包括释放内存和指针悬空两个过程。释放掉resultImage后,该指针指向的内存已经不存在,但是并不影响resultImageToDisp,它任然是一个非NULL的指针,所以if判断语句会失败,而且它的指向内存已经不存在,所以再次释放会报错。

      最后,再次查阅资料,发现没有什么好的方法可以处理,囧。。。

    4,收获

      养成好的习惯,指针变量创建时初始化,要么将指针设置为NULL,要么让它指向合法的内存。

      指针指向的内存被释放后,紧接着将指针置为NULL。

      别用两个指针指向同一内存这种邪恶的东西。

    参考:

      http://bbs.csdn.net/topics/80162678

      http://www.cnblogs.com/haore147/p/3647437.html

    转载于:https://www.cnblogs.com/yssongest/p/4608878.html

    展开全文
  • 调试的时候发现一个现象,类型不同指针指向同一内存单元吗?这打印出来的内存地址,是计算机物理内存的实际地址,还是说是程序为每种类型分别分配的一段内存? 如下,信息为同一段程序同一时刻打印: (lldb) ...
  • 指向同一数组的两个指针变量 相减 表示 相差元素个数,可以 比较 地址编号大小,两个指针变量不能相加 指针变量加一个数表示 跳过(指针变量类型的字节数)*(这个数)的字节数 数组名[ 不越界的情况下可以为复负数 ],...
  • JS数组操作,赋值指向同一指针

    千次阅读 2014-06-03 17:10:46
    这种做法是错的,因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类 型。array2得到的是引用,所以对array1的修改会影响到array2。 Demo: var test = [0,0,0] for (var i = 0; i ; ...
  • 目录 到底什么是指针呢? 指针 指针地址和指针类型 指针取值 ...内存就是一系列有序列号的存储单元,变量就是...指针指向变量的内存地址,指针就像该变量值的内存地址一样 我们来看一个代码片段 func main() { ...
  • 多个指针指向同一个地址

    千次阅读 2017-11-19 20:02:30
    多个指针指向同一个地址,这样使用没什么问题,只是操作时要注意。 因为,每个指针变量保存的值,仅仅是指向的内容的地址值。多个指向同一个地址的指针,若其中一个指针等于NULL,不影响另一个指针。 代码 int* a...
  • // c 程序设计设计 教材例8.16 指向函数的指针。 实现同一函数,根据参数执行不同的子函数。 // 程序请调用c编译器进行编译,(将文件后缀改为.c) /* #include void main() { void operate(); int max(),...
  • swap的值交换和指针指向交换的不同

    千次阅读 2020-06-12 17:32:32
    string s1("hello world"); string s2("hahahah"); //重新开辟空间,交换s1,s2的值 ...//交换两个指针指向不同空间 s1.swap(s2); 参考:https://blog.csdn.net/yam_sunshine/article/details/86582465
  • 《C++ Primer》第五版,中文版。p50。 需要注意的是,一个指针指向某对象,同时另一个指针指向另外对象的下一地址,此时也有可能出现这两个指针值相同的情况,即指针相等。
  • 原来是定义了int型的指针,用它指向了一块double型的内存,才导致取出来的值与原值不同! 关注指针类型
  • 理解 指针数组 数组指针 函数指针 函数指针数组 指向函数指针数组的指针
  • C++ 多个指针指向同一个对象

    千次阅读 2019-03-16 14:01:36
    多个指针指向同一个对象。当对象被删除时,如果有指针没有被赋值为null,将可能出现不可预期的后果。
  • 关于多指针指向同一块内存的问题

    千次阅读 2017-09-15 15:19:12
    有时为了逻辑实现的方便,在程序中会采用多指针指向同一块内存的设计,但是这同时会带来问题: 问题1:容易引发“野指针”错误!即其中一个指针delete了内存之后,其他指针无法判断该指向地址是否还有效,如果也去...
  • 1、指针是一个变量,占用内存空间,用来保存地址
  • 指针相减(同类型不同类型)

    万次阅读 2013-05-21 09:59:19
     如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。  假设我住在广场路124号,Mag住在广场路142号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那麽Mag家就在我家...
  • 指向基类的指针可以指向派生类对象,当基类指针指向派生类对象时,这种指针只能访问派生对象从基类继承而来的那些成员,不能访问子类特有的元素,除非应用强类型转换,例如有基类B和从B派生的子类D,则B *p;...
  • 指向结构体类型数据的指针

    千次阅读 2012-05-08 09:59:35
    第六节 指向结构体类型数据的指针 三、用指向结构体的指针作函数参数 有时想将一个结构体变量的值传给另一个函数,但原来的C标准不允许用结构体变量作为函数参数。那么用什么方法来解决这个问题呢?有两个方法...
  • 多个指针指向同一个对象

    千次阅读 2015-09-20 21:30:09
    这里是没有问题的,因为p1 和p2 的类型都是person指针类型的,代表将p1的值赋值给p2,而p1的值是对象的地址,所以就把对象的地址赋值给了p2,所以p1和p2指向了同一个对象。 无论通过p1还是p2去修改对象,修改的都是...
  • 什么是指向指针指针? 悬空指针 指针从哪里开始? 局部变量和指针之间的差异 那么什么时候没有指针就不可能实现? 但是,有那么多神奇的智能指针! 什么是调用堆栈和堆栈溢出.. 不能没有指针-案例1 不能...
  • 在基类与派生类之间,有一个规定:派生类对象的地址可以赋给指向基类对象的指针变量(简称基类指针),即基类指针也可以指向派生类对象。为什么有这一规定呢?因为它可以实现多态性【1】,即向不同的对象发送同一个...
  • 引用就是对象的另一个名字,使用多个变量名指向同一地址。实际程序中,引用主要用作函数形参。 复合类型。不能定义引用类型的引用,但可以定义任何其他类型的引用。 格式: 类型名& 标示符=已声明的常变量; 2.引用...
  • 指针作为函数参数:为什么需要指针做参数: 1. 需要数据双向传递时(引用也可以达到此效果) 2. 需要传递一组数据,只传首地址运行效率比较高example:#include &lt;iostream&gt; using namespace std; ...
  • 两个指针变量可以相互赋值吗? int *p, *q; p=q; 这样写是什么意思?是p指向q吗? 答:1....3.可以这样写,前提好像是q有确定的地址指向,然后用此语句赋值则表示,指针p和指针q指向相同的地址空...
  • 把全局函数指针指向类的成员函数

    千次阅读 2016-08-12 17:40:55
    我以前经常考虑使用WNDCLASS、CreateThread之类的Windows API时如何在类里面调用,传入函数参数地址时如何使用成员函数的地址。为了研究,写了一个研究程序,代码如下: #include #include <stdio.h>
  • 理解:下标运算符[ ]的优先级是要高于指针运算符*,因此p先和下标运算符结合,决定了p首先是个数组,其类型int *,表明数组的元素都是都是指针。而数组占多少个字节由数组本身决定。其实指针数组表达就是一个存放...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 161,044
精华内容 64,417
关键字:

不同类型指针指向同一地址