Вообще говоря, вы не можете "присваивать значения указателю". Указатель хранит только одно значение, которое является адресом уже существующего объекта.
Если у вас есть указатель, указывающий на существующую переменную структуры, вы можете просто инициализировать это:
struct student s = { .name = "Max", .age = 15, .grade = 8 };
struct student *p = &s;
Если вы хотите использовать динамическое распределение памяти, все становится немного сложнее:
struct student *p = malloc(sizeof *p);
if (!p) {
...
}
malloc
предоставляет вам неинициализированную память, и вы не можете использовать синтаксис инициализатора с существующими объектами.
Но вы можете использовать трюк с составными литералами (доступно с C99):
*p = (struct student){ .name = "Max", .age = 15, .grade = 8 };
Здесь мы используем составной литерал для создания нового безымянного объекта структуры, содержимое которого мы затем копируем в *p
.
Эта же функция может быть использована для избавления от s
в первом примере:
struct student *p = &(struct student){ .name = "Max", .age = 15, .grade = 8 };
Но в этой версии p
все еще указывает на автоматическую память (как локальная переменная).