C++中的引用实质是什么?在内存中如何存储?

解决方案 »

  1.   

    可能跟编译器有关,在VC7.0中,引用也占存储空间的,在内存中体现跟指针一样。下面是一段测试代码,有兴趣的朋友可以验证一下。
    // Sample1.cpp #include "stdafx.h"
    #include <conio.h>
    #include <iostream>#pragma pack(push, S, 1)typedef struct _A
    {
      _A(int i, int &j, float f, double &d, void *p, void *& q) :
        u(i), v(j), w(f), x(d), y(p), z(q) 
      {
      }  int u;
      int &v;
      float w;
      double &x;
      void* y;
      void* &z;
    } A;struct B
    {
      int x;
      int &y;
    };#pragma pack(pop, S)#define GETCHAR(x) (char(((x) > 9) ? ((x) - 10) + 'A' : (x) + '0'))void PrintMemory(void *pStart, size_t size)
    {
      for(unsigned char * p = reinterpret_cast<unsigned char*>(pStart); 
        size > 0; size--, p++)
      {
        std::cout << GETCHAR((*p) >> 4) << GETCHAR((*p) & 0x0F) << " ";
      }  std::cout << std::endl;}void PrintPointer(void *p)
    {
      PrintMemory(&p, sizeof(void*));
    }int _tmain(int argc, _TCHAR* argv[])
    {
      char szBuffer[] = "hello, world";
      
      int i = 2;
      double d = 5.6;
      void * pv = szBuffer + 1;  std::cout << "&i=";
      PrintPointer(&i);  std::cout << "&d=";
      PrintPointer(&d);  std::cout << "&pv=";
      PrintPointer(&pv);  A a(1, i, float(3.4), d, szBuffer, pv);  PrintMemory(&a, sizeof(A));  getch();  return 0;
    }
      

  2.   

    我的一次运行结果如下
    &i=AC FE 12 00
    &d=B4 FE 12 00
    &pv=B0 FE 12 00
    01 00 00 00 AC FE 12 00 9A 99 59 40 B4 FE 12 00 BC FE 12 00 B0 FE 12 00
    可以看出,在对象a的第三个字节处,内存的值跟i的地址一样,而这个地方正好是i的引用。其他两个引用类同。
      

  3.   

    #define GETCHAR(x) (char(((x) > 9) ? ((x) - 10) + 'A' : (x) + '0'))void PrintMemory(void *pStart, size_t size)
    {
      for(unsigned char * p = reinterpret_cast<unsigned char*>(pStart); 
        size > 0; size--, p++)
      {
        std::cout << GETCHAR((*p) >> 4) << GETCHAR((*p) & 0x0F) << " ";
      }  std::cout << std::endl;}
    ///////////////////////////
     arxing(阿行) :
                     这个函数我看不懂,好难哟。有祥解吗?
      

  4.   

    怪不得看不懂
    关键是下面那行不懂。。
    std::cout << GETCHAR((*p) >> 4) << GETCHAR((*p) & 0x0F) << " ";
      

  5.   

    其实和指针没有什么区别,只不过编译器自动把哪个*帮你加上去了而已,而且编译器不允许你再引用别的东西。Thinking in C++就说这么说的