我对C / C ++有些新意,所以假设我有一个简单的结构:
struct item {
int* address;
std::string name;
}
int*
是否是保存内存地址的正确数据类型?我可以使用以下内容:
item i; i.address = &i.;
要将structs属性设置为自己的地址吗?
答案 0 :(得分:5)
在C / C ++中,指针是类型。您可以在任何指针中存储任何其他指针(因为它只是内存中的字节索引),但您无法自由转换它们(您需要使用强制转换)。通常,类型为T
的变量上的指针应具有类型T *
。所以在你的例子中应该是:
struct item {
std::string * address;
std::string name;
}
是的,你可以:
item i;
i.address = &(i.name);
如果您想存储成员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;