Вопрос об указателе структуры C ++ - PullRequest
5 голосов
/ 01 ноября 2010

Это, вероятно, просто, но я пытаюсь лучше понять указатели. Допустим, у меня есть структура

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

и скажем, у меня есть куча таких, которые хранятся в памяти, как один за другим. так что теперь я объявляю новый указатель на структуру.

struct Person *ptr;

Будет ли этот указатель запускаться при первой записи? (он же первое «Имя»), и когда я его повторяю (он же ptr ++), он переходит к следующей СТРУКТЕМЕ или следующей «записи», такой же как имя -> ID ---> Адрес

Итак, скажем, Im в первой записи, например, и данные:

Jason Adams
111222333
111 Fake Drive
55555551000

и вторая запись

Matt Johns
111555333
555 Derp lane
1000022434

теперь я итерирую ptr (ptr ++), будет ли ptr указывать на вторую структуру (та, что с Мэттом Джонсом) или она будет указывать на "ID" Джейсона Адамса

Надеюсь, это имеет смысл?

Ответы [ 3 ]

5 голосов
/ 01 ноября 2010

Это будет указывать на вторую структуру. Указатель будет продвинут на sizeof(Person).

2 голосов
/ 01 ноября 2010

Как упоминал Джон, он будет расширен на размер самого себя - он же sizeof (Person).

Однако манипулирование указателем - это весело, и вы можете делать такие вещи, как приведение указателя к другому типу.Как только вы это сделаете, арифметика указателя будет увеличиваться на базовый размер типа.Обычно вы видите указатели, приведенные к (byte *) или (unsigned char *), чтобы позволить индивидуальный байтовый доступ к базовым данным.

0 голосов
/ 01 ноября 2010

Прежде всего, вы должны выделить память для вашего указателя 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 доступа, увеличивая ptr.

Как показано выше, вы можете получить доступ к идентификатору члена структуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...