В C структура — это определяемая пользователем переменная, используемая для хранения коллекции переменных в рамках одной сущности. Давайте воспользуемся простой аналогией, чтобы объяснить реализацию и полезность структур в C.
Предположим, мы хотим хранить информацию о пользователях, использующих определенный сервис. Такая информация может включать имя пользователя, электронную почту, адрес, режим обслуживания и т.д. Чтобы сохранить такую информацию, мы можем создать каждый атрибут как отдельную переменную. Однако, когда у нас больше десяти пользователей, код может выйти из-под контроля и стать очень трудным и утомительным для чтения.
Чтобы решить эту проблему, мы можем создать структуру. Внутри структуры мы можем хранить все атрибуты, общие для всех пользователей, а затем добавлять уникальные переменные для каждого пользователя.
Давайте посмотрим на различные примеры, чтобы увидеть, как это реализовать.
Как определить структуру на C
Чтобы определить структуру в C, мы используем ключевое слово struct, за которым следует имя структуры. После имени у нас есть пара фигурных скобок, куда мы добавляем элементы.
Рассмотрим синтаксис ниже:
struct struct_name
{
/* data */
type member_name;
type member_name2;
type member_name3;…
type member_nameN;
};
Имя структуры может быть любым, если оно соответствует соглашению об именах языка программирования C.
Мы можем реализовать пример структуры пользовательской аналогии как:
struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
};
Как создать структурные переменные
Есть два основных способа создания структурных переменных. Первый — объявить их как обычные переменные, а второй — установить их с помощью фигурных скобок.
В приведенном ниже примере показано, как объявить структурные переменные как стандартные переменные C.
struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
};int main(int argc, char const *argv[])
{
struct users user1, user2, user3
return 0;
}
Другой метод создания структурных переменных показан ниже:
struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
} user1, user2, user3;
В этом примере мы создаем их во время объявления структуры.
Член структуры Init
Вы не можете инициализировать элементы структуры во время создания, поскольку для этого типа нет выделенной памяти.
Чтобы инициализировать элементы структуры, используйте фигурные скобки, как показано ниже:
struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
};
int main(int argc, char const *argv[])
{
struct users user1 = {«myusername», «zero@user.name», 35, true}
return 0;
}
Члены структуры доступа
Чтобы получить доступ к членам структуры, мы используем оператор точки, начиная с имени структуры, точки и имени члена.
struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
};
int main(int argc, char const *argv[])
{
struct users user1 = {«myusername», «zero@user.name», 35, true}
user1.email = «zero@vuln.io»
return 0;
}
В этом примере мы получаем доступ к членам user1.
Ключевое слово Typedef
Мы используем ключевое слово typedef для создания псевдонима для типов данных, что делает код более читабельным.
Например:
typedef struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
} u;
int main(int argc, char const *argv[])
{
u user1 = {«myusername», «zero@user.name», 35, true}
user1.registered = false
return 0;
}
В приведенном выше примере мы создали псевдоним „u“ для структуры „users“. Следовательно, нам не нужно каждый раз вызывать struct users. Мы можем использовать „u“, как определено выше.
Указатели структуры
У вас также может быть указатель на структуру. Это позволяет получить доступ к членам с помощью оператора ->.
Например:
typedef struct users
{
char username[20];
char email[225];
char address[50];
int age;
bool registered;
} u;
int main(int argc, char const *argv[])
{
u user1 = {«myusername», «zero@user.name», 35, true}// pointer to another structure
u *user_ptr = &user1
user_ptr -> username = «ptrusername»
return 0;
}
Заключение
В этом руководстве рассматриваются основы работы со структурами на языке программирования C.