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

Это может быть глупый вопрос, но я только изучаю 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

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

mantissa 13.02.2023 09:39

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

Fe2O3 13.02.2023 09:51

@mantissa Строго &struct1 не является указателем на указатель. Это указатель на массив.

Support Ukraine 13.02.2023 10:18

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

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

Ответы 1

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

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

pointer = &struct1;

это неверно. Выражение в правой части присваивания &struct1 имеет тип указателя STRUCT ( * )[30], а операнд в левой части имеет тип указателя STRUCT *, и неявное преобразование из одного типа в другой отсутствует.

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

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' );

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

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

pointer[i] эквивалентно выражению *( pointer + i] ). И выражение &pointer[i] соответственно эквивалентно pointer + i.

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