Обход структур с помощью указателя++

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

Я заявил:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> 

typedef struct STRUCTURE{
    char name[30];
}STRUCT;

int main(void){
    STRUCT struct1[30] // declaring 30 structs.
    STRUCT *pointer;
    pointer = &struct1;
    return 0;
}

Теперь, если бы я хотел сослаться на конкретную структуру (из 30 структур), я мог бы сделать это так:

&struct[0] // first struct's memory location
&struct[1] // second struct's memory location 
...
&struct[i] // where i = 0, 1, 2, 3, 4, 5 ... 29

Но как мне это сделать с помощью указателя?

Я думал, увеличив указатель, я смогу пройти по структурам:

pointer++

Но я никак не могу добраться от struct1[i] до struct1[i+1] с pointer++

pointer = &struct1; недействителен C. Разве вы не получили сообщение от компилятора? Какой компилятор вы используете и какие уровни предупреждений используются? Также здесь нет точки с запятой: STRUCT struct1[30]
Lundin 13.02.2023 09:32

"Но я не могу перейти от struct1[i] к struct1[i+1] с помощью указателя++" Ну, вот как это работает.... Но рассказывает, как вы пришли к такому выводу. У вас должен быть код!!! Опубликовать

Support Ukraine 13.02.2023 09:34

mantissa 13.02.2023 09:39

OT: назвать свой личный тип данных «STRUCT» можно, но это не очень хорошая идея. Использовать ваше воображение!!

Fe2O3 13.02.2023 09:51

Support Ukraine 13.02.2023 10:18

"... но я только изучаю C." Хорошо, вот самая первая и очень важная вещь, которую нужно узнать о C: убедитесь, что ваш компилятор настроен на высокий уровень предупреждений и исправляет все предупреждения перед запуском программы. Для gcc как минимум порекомендую: gcc -Wall -Wextra -Werror

Support Ukraine 13.02.2023 10:21
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
6
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для начала это задание

pointer = &struct1;

Вместо этого вам нужно написать

STRUCT struct1[30] // declaring 30 structs.
STRUCT *pointer;
pointer = struct1;

В этом случае указатель массива struct1 неявно преобразуется в указатель на его первый элемент, а указатель pointer будет указывать на этот первый элемент массива struct1, и, используя арифметику указателя, вы можете получить доступ к любому элементу массива.

Например, для вывода строк, хранящихся в элементе данных name элементов массива (при условии, что они инициализированы), используя цикл for, вы можете написать

for ( STRUCT *p = struct1; p != struct1 + 30; ++p )
{
    printf( "%s ", p->name );
}
putchar( '\n' );

Или вместо использования магического числа 30 вы можете ввести именованную константу, например

enum { N = 30 };
STRUCT struct1[N];

И n, чтобы написать цикл как

for ( STRUCT *p = struct1; p != struct1 + N; ++p )
{
    printf( "%s ", p->name );
}
putchar( '\n' );

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

Обратите внимание на то, что выражение

Другие вопросы по теме