MyTetra Share
Делитесь знаниями!
Структуры в языке Си. Указатели на структуры
Время создания: 30.03.2023 15:29
Текстовые метки: язык, Си, C, структура, struct, указатель
Раздел: Компьютер - Программирование - Язык C (Си)
Запись: xintrea/mytetra_syncro/master/base/1680179361lkasia61ds/text.html на raw.github.com

На структуры, как и на объекты других типов, можно определять указатели. Например, указатель на структуру person (в языке C ключевое слово struct в определении переменной обязательно, в C++ - нет):


struct person *p;



Указатели на структуры можно создавать и для безымянных структурных типов:



struct

{

int age;

char name[20];

} *p1, *p2;



В качестве значения такому указателю присваивается адрес объекта структуры того же типа:



struct person kate = {31, "Kate"};

struct person *p_kate = &kate;



Используя указатель на структуру, можно получить доступ к ее элементам. Для этого можно воспользоваться двумя способами. Первый способ представляет применение операции разыменования:



(*указатель_на_структуру).имя_элемента



Второй способ предполагает использование операции -> (операция стрелка):


указатель_на_структуру->имя_элемента



Используем оба этих способа для обращения к элементам структуры:



#include <stdio.h>

struct person

{

int age;

char name[20];

};

int main(void)

{

struct person kate = {31, "Kate"};


// указатель на переменную kate

struct person * p_kate = &kate;

// получаем значение элемента name

// получаем значение элемента age

char * name = p_kate->name;

int age = (*p_kate).age;

printf("name = %s \t age = %d \n", name, age);

// изменим элемент age в структуре

p_kate->age = 32;

printf("name = %s \t age = %d \n", kate.name, kate.age);

return 0;

}



Здесь определяется указатель p_kate на переменную kate. И используя указатель, мы можем получить или изменить значения элементов структуры.



Ссылка структуры на саму себя


Элементы структуры могут представлять указатель на структуру этого же типа. Подобная ситуация встречается довольно часто в различных типах данных, которые состоят из связанных звеньев, например, в связных списках, где каждый элемент имеет указатель на следующий и/или предыдущий элемент этого же типа структуры. Например:



struct node

{

char* value; // значение

struct node* next; // указатель на следующий узел

};



Структура node имеет два элемента. Элемент value хранит собственно некоторое значение. А элемент next представляет указатель на следующий объект структуры node. Как мы можем использовать эту структуру и зачем нам указатель на следующий объект node? Рассмотрим следующий пример:



#include <stdio.h>

struct node

{

char* value;

struct node* next;

};

int main(void)

{

struct node kate = {.value = "Kate"};

struct node tom = {.value = "Tom" };

struct node bob = {.value = "Bob"};

kate.next = &tom; // Kate - Tom

tom.next = &bob; // Tom - Bob

// устанавливаем указатель на первую структуру в цепочке

struct node * pointer = &kate;

while(pointer != NULL)

{

printf("value = %s \n", pointer->value);

pointer = pointer->next; // переходим к следующему объекту

}

return 0;

}



Здесь определяем три переменных структуры: kate, tom и bob. У объекта kate элемент next указывает на объект tom:



kate.next = &tom;



А у объекта tom элемент next указывает на объект bob:



tom.next = &bob;



Таким образом, фактически мы получим цепочку Kate - Tom - Bob или грубо говоря список объектов структуры node.


Используя эти указатели, мы можем перемещаться вперед по этому списку. Для этого сначала устанавливаем указатель на первую структуру:



struct node * pointer = &kate;



Далее в цикле while пока указатель pointer не будет указать ни на какой объект структуры (то есть будет равен NULL) выводим значение value текущего объекта, на который указывает pointer, и затем присваиваем ему значение указателя pointer->next, то есть переходим к следуюшей структуре в списке:



while(pointer != NULL)

{

printf("value = %s \n", pointer->value);

pointer = pointer->next;

}



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


Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования