Это может быть глупый вопрос, но я только изучаю 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++
"Но я не могу перейти от struct1[i] к struct1[i+1] с помощью указателя++" Ну, вот как это работает.... Но рассказывает, как вы пришли к такому выводу. У вас должен быть код!!! Опубликовать
имя массива уже является указателем на его первый элемент, не нуждающийся в &, и получение его адреса с помощью &struct1
даст вам указатель на указатель, а это не то, что вам нужно.
OT: назвать свой личный тип данных «STRUCT» можно, но это не очень хорошая идея. Использовать ваше воображение!!
@mantissa Строго &struct1
не является указателем на указатель. Это указатель на массив.
"... но я только изучаю C." Хорошо, вот самая первая и очень важная вещь, которую нужно узнать о C: убедитесь, что ваш компилятор настроен на высокий уровень предупреждений и исправляет все предупреждения перед запуском программы. Для gcc
как минимум порекомендую: gcc -Wall -Wextra -Werror
Для начала это задание
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
.
pointer = &struct1;
недействителен C. Разве вы не получили сообщение от компилятора? Какой компилятор вы используете и какие уровни предупреждений используются? Также здесь нет точки с запятой:STRUCT struct1[30]