C ++指向struct成员的指针

时间:2014-07-03 19:05:16

标签: c++ pointers struct memory-address

如果我要制作一个结构,请说:

struct FOO{    
    int x, y, z, a, b, c;  
}

int main(){  
    FOO foo = {1, 2, 3, 4, 5, 6};        

    return 0;
}

无论如何都会创建一个可以访问FOO整数成员的指针吗? 也许通过制作指向foo的指针然后以某种方式修改它以整数递增?

我知道如果我要用一个返回指向第一个int的指针的方法来创建一个类,那么我可以使用++或[i](在for循环中)循环使用成员。但我想知道我是否可以通过了解结构的地址来访问结构成员(假设我对如何导航所述结构有很好的理解)

非常感谢任何见解。 谢谢!

5 个答案:

答案 0 :(得分:2)

您可以为结构重载operator []:

struct bar // ALL_UPPERCASE is for macros!
{
    int a, b, c, d, e, f;
    int operator[](size_t i) const
    {
        switch(i)
        {
        case 0: return a;
        case 1: return b;
        case 2: return c;
        case 3: return d;
        case 4: return e;
        case 5: return f;
        default: assert(false);
        }
    }
};

答案 1 :(得分:1)

只是一个想法,这可能不起作用,但你可以尝试做一个指向foo结构的指针,然后将指针移动每个元素的int大小。如下所示:

    int * ptr= & foo;
    ptr++;

如果我能够很好地记住我的硬件设计类,那么结构实际上与内存中的数组非常相似,它可以为每个索引提供可变大小的内存块。

答案 2 :(得分:1)

struct FOO{    
    int x, y, z, a, b, c;  
} __attribute__ ((packed))

FOO foo;
int *i = &foo;

在这种情况下,属性((packed))消除了填充所产生的问题,因为它可以消除它。然后递增i,受助者它将在结构的下一个元素中。

答案 3 :(得分:0)

这很简单:

Foo foo = { 1, 2, 3, 4, 5, 6 };
int* pfoo = &foo.x;

int structMembers = sizeof(Foo) / sizeof(int);
for (int i = 0; i < structMembers; i++)
{
    cout << pfoo[i] << endl;
}

除了默认访问修饰符(结构中的私有,类中的公共)之外,结构和类之间没有区别。因此无论你怎么做类,你都可以使用结构。

答案 4 :(得分:-2)

据我所知,您需要这个:https://en.cppreference.com/w/cpp/utility/functional/mem_fn

如果您需要自己的实现,请执行以下操作:

#include <iostream>

struct Foo
{
  int a = 1;
  char b = 'a';
};

template<typename Struct, typename var_type>
const var_type member_get( Struct& obj, var_type Struct::* mem_var ) { return 
obj.*mem_var; }

int main() 
{
  Foo x;
  std::cout << member_get( x, &Foo::a ) << std::endl;
  std::cout << member_get( x, &Foo::b ) << std::endl;
  return 0;
}