【问题标题】:C++ Struct pointer questionC++结构指针问题
【发布时间】:2010-11-01 01:37:06
【问题描述】:

这可能很简单,但我试图更好地理解指针。 假设我有一个结构

struct Person{
  char Name[20];
  char ID[15];
  char Address[50];
  char Number[15];
};

假设我有一堆这些像一个接一个地存储在内存中。 所以现在我声明了一个指向该结构的新指针。

struct Person *ptr;

这个指针会从第一个条目开始吗? (又名第一个“名称”),当我迭代它(又名 ptr++)时,它会转到下一个 STRUCT 还是下一个“条目”,也就是名称-->ID--->地址

例如,让我在第一个条目上说我,数据是:

Jason Adams
111222333
111 Fake Drive
55555551000

第二个条目是

Matt Johns
111555333
555 Derp lane
1000022434

现在我迭代 ptr (ptr++) 将 ptr 指向第二个结构(带有 matt johns 的那个)还是指向 Jason Adams "ID"

我希望这是有道理的?

【问题讨论】:

    标签: c++ pointers struct


    【解决方案1】:

    它将指向第二个结构。指针将前进sizeof(Person)

    【讨论】:

    • 哦,如果我想进入下一个条目,我会使用 ptr+sizeof(Person)?还是仅在使用 ptr++ 时“知道”进入第二个结构
    • 没有。每当您向指针添加整数值时,它都会隐式将该值乘以sizeof(<pointed-to type>)。如果将 1 加到一个指针上(通过ptr++ptr + n),它会隐式推进“指向元素之一”。如果您将sizeof(Person) 添加到Person*,它将前进不止一个条目。
    • 哦,谢谢。这就是我的想法,但不是 100% 确定。
    【解决方案2】:

    正如 John 提到的,它将根据自身的大小 - 也称为 sizeof(Person)。

    然而,指针操作很有趣,你可以做一些事情,比如将指针转换为不同的类型。一旦你这样做了,指针算术将按类型的基础大小前进。通常,您会看到转换为 (byte *) 或 (unsigned char *) 的指针,以允许单个字节访问基础数据。

    【讨论】:

    • 很有趣,假设您想将 ptr 提升为指向 Jason Adams “ID”(我不知道您为什么要这样做),但出于好奇,您将如何去做呢?
    • 你不能合法地这样做并且仍然有一个指向 Person 的指针,因为 char [15]Person 的类型不同。
    • 那么他说“将指针转换为不同类型”是什么意思,对不起,我不是最好的指针:(
    【解决方案3】:

    首先,在使用指针ptr之前,你必须为其分配内存。

    auto_ptr<Person> ptr(new Person); //auto_ptr for automatic freeing
    

    之后,你可以试试下面的代码。

    strcpy(ptr->ID, "100"); //For illustraction
    int offset = ptr->ID - ptr->Name; //Get offset of ID member
    char *pID = ((char *)ptr.get())+ offset;
    //Typecast to char pointer and increment by offset to get to ID field
    cout<<pID; //Now pId can be used to access ID.
    

    您问如何通过递增 ptr 来访问 ID 属性。

    如上图,可以访问结构体的ID成员。

    【讨论】:

    • 你不应该使用auto_ptr,它在 C++0x 中已被弃用。
    • @Adam:是的,我知道。但是 OP 标记为 c++
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 2013-09-12
    相关资源
    最近更新 更多