когда вы объявляется
my_str * str;
str - это указатель на структуру, на место в памяти где она лежит, но сам по себе указатель ничто, структуры нет.
my_str str;
так вы создадите структуру и сможете обращаться к ее полям как str.field, то есть через точку.
далее можно сделать указатель my_str *str2 = &str;
и уже обращаться к полям через стрелку
str2->field, при это такое обращение будет к полю именно первой структуры str.
структуры периферии проца описаны через указатели так (условно)
GPIO_STR *PORT1 = (GPIO_STR *) 0x434002300;
потому что в памяти уже есть данные лежащие как поля в структуре, это собственно регистры управляющие периферией, и вы создаете явный указатель на эту область памяти
Цитата
Простите, но я вас немного не понял. Если можете, ткните носом в статейку, где можно про это почитать, что бы вас не утруждать
есть разное выравнивание памяти, и иногда структура вида
struct...
{
char field1;
char field2;
}
может быть в памяти представлена 2 байтами, лежащими друг за другом, а может 8 байтами, где в 0 лежит field1, потом 3 байта пропуска, и в 4 лежит filed2. Это сделано потому что некоторые процы умеют брать данные только 32 битными или 16 битными словами, и в принципе не могут обращаться в области памяти с адресами не кратными их размеру слова.
так вот есть специальные слова позволяющие подсказывать как создавать структуру, типа __packed
Цитата
По-моему вы ошиблись=)
он не ошибся, он заменил указатель структуры на экземпляр
type1_t main_var;
вместо ваших
type1_t *main_var;
и соответственно вызовы через стрелку на вызовы через точку.
а также добавил функцию обработки данных структуры через указатель...
И в целом это все не относиться к кейлу или арму, это вообще вопросы базового знания языка С....