LINUX.ORG.RU

Как пользоваться указателями и структурами в си

 , , ,


0

0

Здравствуйте. Пытаясь накодить задание для зачётки столкнулся с проблемкой. А именно не знанием как передавать в функции структуры, использовать их внутри функции, правильно определять.А также чем отличается, когда передаёшь в качестве параметра указатель и когда просто передаёшь саму переменную(ну или структуру). Если несложно то я был бы благодарен и за примеры синтаксиса и объяснение где, когда и что использовать. Учителя я могу спросить, а вот понять не особо, так как учусь в Словакии, а в инете находил только поверхностные упоминания. P.s. Только сейчас заметил, что забыл упомянуть, что всё происходит в языке си.


Про китайский интернет слышал, про словацкий — нет. Уж какой-нибудь учебник по C наверняка в гугле найти можно и не полениться потраться пару дней на изучение.

struct a {
    int value;
};

void do_something(struct a * foo) {
    foo->value = 42;
}

...

struct a bar;
do_something(&bar);
// bar.value == 42
Dendy ★★★★★
()

Быстрее всё спрашивай про язык Си !!!
А то скоро рашкинский интернет как словацкий будет бггг

mos ★★☆☆☆
()
Ответ на: комментарий от Dendy

Ну я понял, что когда есть знак & перед функцией, то мы передаём указатель, но в чём разница между тем, чтобы просто передать без него. А также, что значит значок -> и почему пишется не foo.value.

Nullum
() автор топика

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

Когда передаешь указатель, можешь менять оригинал внутри функции, на стеке передается только ссылка.

rubic
()
Ответ на: комментарий от rubic

Вот за это спасибо. С переменными не внутри структуры всё также работает? Синтаксис внутри функции не меняется?

Nullum
() автор топика
Ответ на: комментарий от Nullum

А также, что значит значок -> и почему пишется не foo.value.

Потому что указатель на структуру это не структура, вот и нужен другой оператор.

но в чём разница между тем, чтобы просто передать без него

Тебе реально нужно учить то, что такое указатель. Иначе будет только боль.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Nullum

Подождите, сначала важно понять разницу между типами:

struct a *
и
struct a
В первом случае - указатель на структуру a. Проще всего его представлять как адрес в оперативной памяти, который может занимать 4 байта, 8 байт и т.п.
Во стором случае - сама структура, размер который зависит от того, как Вы ее определили (ну и еще может быть выравнивание в памяти).
После этого можно рассмотреть функцию:
void do_something(struct a * foo)
{
      foo->value = 42;
}  
В данном случае foo это локальная переменная, т.е. память для нее выделяется автоматически на стеке, а после завершения работы функции память будет освобождена. В общем случае память стека мала и поэтому, чем меньше Вы ее будет использовать, тем лучше (т.е. указатель на возможно большую структуру в памяти предпочтительнее).
Если Вы будете использовать функцию так:
struct a {
        int value;
};

void do_something(struct a foo)
{
        foo.value = 42;
}

...

struct a bar;
bar.value = 11;
do_something(bar);
// bar.value == 11
то приготовьтесь к тому, что каждый раз при вызове do_something Вы будете расплачиваться тем, что будете выделять память на стеке под целую структуру a, так еще и полностью копировать bar в foo.

dsl
()
Ответ на: комментарий от Bfgeshka

Ну оно жы изрекло - препод что-то лопочет не по нашему, а в словацком интернете ничего про эти ваши указатели нет(((

mos ★★☆☆☆
()
Ответ на: комментарий от mos

Преподавание должно быть на английском вроде бы. По крайней мере при поступлении в европейские вузы обычно требуют IELTS баллов на 7-8 минимум.

dsl
()
Ответ на: комментарий от mos

Имелось ввиду, что на сайтах на русском в основном обобщённая информация, а на прочтение учебника времени нету.

Nullum
() автор топика
Ответ на: комментарий от dsl

Да, но на английском преподавание платное, а те кто согласен учиться на словацком могут учиться бесплатненько. А айлетс не требуют, требуют табеля.

Nullum
() автор топика
Ответ на: комментарий от Nullum

Хех, ради такого дела я бы не стал жалеть денег. Тем более в Словакии с работой для Embedded C дела вроде хорошо обстоят.

dsl
()
Ответ на: комментарий от Nullum

На английском интернет не более платен, чем на русском или словацком. Литературы по вопросу полно - как академической, так и наглядно-популярной.

Bfgeshka ★★★★★
()
Последнее исправление: Bfgeshka (всего исправлений: 1)
Ответ на: комментарий от dsl

Вот к примеру. Если я передал в функцию указатель, а внутри есть функция требующая именно саму структуру, то как сделать это правильно?

Nullum
() автор топика
Ответ на: комментарий от Nullum

именно саму структуру

Тут все зависит от того, что ты вкладываешь в эти слова.

Если есть структура A и ты передаешь указатель на A (&A, операция взятия адреса структуры A), то это и есть сама структура(оригинал). Строго говоря, это адрес первого элемента в структуре.

Если ты передаешь структуру по значению, то создаётся полноценная копия структуры внутри функции.

А вообще, держи изучай классику. Это не истина в последней инстанции, но общие понятия ты из этой книги должен усвоить https://fex.net/#!768271438033

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Nullum

Во-первых, то, что ты написал полная тарабарщина. Читай книгу. Будут вопросы, пиши тут. Также читай в Сети про то, что такое формальные и фактические параметры функции.

Если попытаться распарсить то, что ты написал, то в функцию function должен быть передан по значению некий фактический параметр (переменная) определенного типа, которая инициализирована ранее. И тип этого фактического параметра должен совпадать с типом формального параметра, который указан в сигнатуре функции.

Вот только то, что ты написал в сигнатуре функции я совершенно не понял, т.к. это бессмыслица. Ты сам хоть понял? Объясни словами.

Так что, читай книгу.

Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Имелось ввиду, что внутрь одной функции передаётся указатель(struct x *y), а в другой требуется (const struct x y).

Nullum
() автор топика
Ответ на: комментарий от Nullum

Ты это имел в виду?

#include <stdio.h>

struct AnyStruct { int x, y; };

void f1(struct AnyStruct* p);
void f2(struct AnyStruct v);

void f1(struct AnyStruct* p)
{
  printf("f1: %i,%i\n", p->x, p->y);
  f2(*p); // Здесь передаём по значению.
  printf("f1: %i,%i\n", p->x, p->y);
}

void f2(struct AnyStruct v)
{
  v.x++; v.y++; // Изменяем поля структуры.
  printf("f2: %i,%i\n", v.x, v.y);
}

int main()
{
  struct AnyStruct a={1, 1};
  f1(&a); // Здесь передаём по ссылке.
  return 0;
}

Вывод:

f1: 1,1
f2: 2,2
f1: 1,1
aureliano15 ★★
()
Ответ на: комментарий от Nullum

Раз ты выбрал такой способ изучения, то для закрепления темы тот же код с передачей по ссылке.

#include <stdio.h>

struct AnyStruct { int x, y; };

void f1(struct AnyStruct* p);
void f2(struct AnyStruct* v);

void f1(struct AnyStruct* p)
{
  printf("f1: %i,%i\n", p->x, p->y);
  f2(p); // Здесь передаём уже по ссылке.
  printf("f1: %i,%i\n", p->x, p->y);
}

void f2(struct AnyStruct* v)
{
  v->x++; v->y++; // Изменяем поля структуры.
  printf("f2: %i,%i\n", v->x, v->y);
}

int main()
{
  struct AnyStruct a={1, 1};
  f1(&a); // Здесь передаём по ссылке.
  return 0;
}

Выражение AnyStruct* v читается как переменная v есть указатель на структуру типа AnyStruct

Вывод

f1: 1,1
f2: 2,2
f1: 2,2
Twissel ★★★★★
()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Nullum

Пожалуйста:

void MSIM_ReadSREGFlag(struct MSIM_AVR mcu)
{
}

void exec_brcs_brlo(struct MSIM_AVR *mcu)
{
        /* ...code... */

        /* Мы разыменовываем указатель чтобы вызвать функцию */
        MSIM_ReadSREGFlag(*mcu);
}

dsl
()

Учителя я могу спросить, а вот понять не особо, так как учусь в Словакии

Чувак, если у тебя уже такие проблемы, может стоит сначала словацкий выучить? Потому что дальше будет только хуже.

hateyoufeel ★★★★★
()

Ты учишься на программиста или это просто предмет из программы? Если первое, то прочитай книжку по си, разберись. Если ты не можешь самостоятельно(или из работы с преподом) понять таких вещей(это прямо база-база),то у меня для тебя плохие новости...

Dudraug ★★★★★
()
Ответ на: комментарий от Dudraug

Ты учишься на программиста или это просто предмет из программы?

Судя по изучаемому языку, либо на программиста, либо что-то очень близкое (какой-нибудь электронщик со знанием программирования). Может ещё математик (на мехмате МГУ дают си, например).

Если ты не можешь самостоятельно(или из работы с преподом) понять таких вещей(это прямо база-база),то у меня для тебя плохие новости...

Это действительно база, но база довольно непростая. Поэтому, имхо, ничего страшного, что кто-то сразу этого не понял. Всё-таки не бейсик. :-)

aureliano15 ★★
()
Ответ на: комментарий от te111011010

Скорее всего язык есть на начальном уровне. У меня например так с польским. Английского хватает за глаза, поэтому особо нет стимула учить язык. Хотя тут другой случай - учеба, поэтому и стумул должен быть по идее.

dsl
()
Ответ на: комментарий от te111011010

Понимаю когда объясняют. А вот самому сказать, что тебе надо....

Nullum
() автор топика
Ответ на: комментарий от Nullum

Да в любом селе так себе жить. Странно, я думал в Словакии всё на уровне гермашек

AntonyRF ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.