C++结构体指针问题

5
这可能很简单,但我正在尝试更好地理解指针。假设我有一个结构体:
struct Person{
  char Name[20];
  char ID[15];
  char Address[50];
  char Number[15];
};

假设我有一堆这样的结构体存在内存中,一个接一个地存储。

现在我声明了一个指向该结构体的新指针。

struct Person *ptr;

这个指针会从第一个入口开始吗?(也就是第一个“名称”),当我遍历它(ptr ++)时,它会去下一个结构体还是下一个“条目”,比如name--> ID --- >地址?

比如说,我现在在第一个条目,数据是:

Jason Adams
111222333
111 Fake Drive
55555551000

第二个条目是

Matt Johns
111555333
555 Derp lane
1000022434

现在我迭代指针 (ptr++),这个指针会指向第二个结构体(带有Matt Johns的那个)还是会指向Jason Adams的“ID”?

希望这样说清楚了。

3个回答

5

它将指向第二个结构体。指针将会向前移动 sizeof(Person)


哦,如果我想要进入下一个条目,我应该使用ptr + sizeof(Person)吗?还是当仅使用ptr ++时它会“知道”转到第二个结构体? - user475353
1
不管何时,当您将整数值添加到指针中时,它会隐式地将该值乘以sizeof(<pointed-to type>)。如果您将1添加到指针中(通过ptr++ptr + n),它会隐式地前进“一个指向的元素”。如果您将sizeof(Person)添加到Person*中,则会超过一个条目。 - John Calsbeek
哦,明白了,谢谢。我也觉得是这样,但不是100%确定。 - user475353

1

正如John所提到的,它将通过其大小-即sizeof(Person)而变得更加先进。

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


有趣的是,假设你想要将指针推进到指向Jason Adams的“ID”(我不知道为什么你想这样做),但只是出于好奇,你会如何去做呢? - user475353
你不能在仍然拥有指向Person的指针时这么做,因为char [15]不是与Person相同的类型。 - John Calsbeek
那么当他说“将指针转换为不同类型”时,他的意思是什么呢?抱歉,我对指针不是很熟练。 - user475353

0
首先,在使用指针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.

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

如上所示,您可以访问结构的ID成员。


你不应该使用auto_ptr,因为它在C++0x中已被弃用。 - Adam Rosenfield
@Adam:是的,我知道。但 OP 标记为 C++。 - bjskishore123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接