C ++将struct属性设置为自己的地址

时间:2015-03-08 01:22:48

标签: c++ struct

我对C / C ++有些新意,所以假设我有一个简单的结构:

struct item {
   int* address;
   std::string name;
}
  1. int*是否是保存内存地址的正确数据类型?
  2. 我可以使用以下内容:

    item i;
    i.address = &i.;
    

    要将structs属性设置为自己的地址吗?

3 个答案:

答案 0 :(得分:5)

  1. 在C / C ++中,指针是类型。您可以在任何指针中存储任何其他指针(因为它只是内存中的字节索引),但您无法自由转换它们(您需要使用强制转换)。通常,类型为T的变量上的指针应具有类型T *。所以在你的例子中应该是:

    struct item {
       std::string * address;
       std::string name;
    }
    
  2. 是的,你可以:

     item i;
     i.address = &(i.name);
    
  3. 如果您想存储成员name的地址。

    如果您想存储结构地址:

    struct item {
       item * address;
       std::string name;
    }
    
    item i;
    i.address = &i;
    

答案 1 :(得分:3)

通常情况下,如果您只想要一个内存地址,则将其存储在void*中,因为该类型没有任何关于指向事物的指示的内涵。

如果要保留item::address是包含指向item对象的指针的成员的含义,那么它应该具有类型item*,可能与{{1}适当地限定如果合适的话。

(当然,在const中,类型将改为C,因为它会保存指向struct item*对象的指针

答案 2 :(得分:0)

int *x;用于创建指向int的指针,因此您可以执行以下操作:

int j = 4;        // create an int variable
int *pToJ = &j;   // create a pointer that contains the address of the int j.

对于struct,您可以通过定义结构,创建结构变量,创建指向结构的指针,然后将结构变量的地址分配给结构指针变量来做类似的事情。这看起来像C:

struct __tagStruct {  // start a struct definition declaring a name of __tagStruct
  int  i;
  int  j;
};

struct __tagStruct myStruct;
struct __tagStruct *pMyStruct = &myStruct;

// or C++ allows you to use the struct name as a type name like a class
__tagStruct  myStruct2;
__tagStruct *pMyStruct2 = myStruct2;

如果你想拥有一个可以包含自己地址的结构,那么你需要在结构定义中包含一个成员变量,它是指向结构类型的指针。这有点困难,因为为了定义指向结构的指针,您必须首先定义或声明结构。幸运的是,指向结构的指针只是声明结构定义存在就足够了。所以你可以做到以下几点:

struct __tagStruct {      // starts the struct definition declaring a name of __tagStruct
   __tagStruct  *pMe;   // define a pointer variable to this struct type C++ style
   int    i;
   int    j;
};

struct __tagStruct  myStruct;    // define the struct variable C style
myStruct.pMe = &myStruct;

// or C++ allows you to use the struct name like a class for a type
__tagStruct  myStruct;
myStruct.pMe = &myStruct;        // assign to the pMe member the address of the struct

如果struct包含指向不同结构类型的指针,那么您可以执行以下操作:

struct __tagStruct1;

struct __tagStruct2 {
  __tagStruct1 *pIt;    // pointer to the previously declared struct
  int  j;
};

__tagStruct1  myStruct1;
__tagStruct2  myStruct2;
myStruct2.pIt = &myStruct1;