Смешивание цепочек «.» и & quot; & gt; & quot; операторы

Имея некоторые опасения по поводу функциональности ссылки на член и операторов указателя.

Возьмите следующий пример:

struct ID{
uint8_t index;
bool active;
}

struct Square{
struct ID shortID;
struct BUDDY *bud;
uint8_t x;
uint8_t y;
};

А потом я верну указатель на квадрат ..
Мой вопрос: Могу ли я затем изменить элементы идентификатора и отразить изменения во вложенной структуре?

void function1()
{
Square *someSquare = GetSquare(1);
someSquare->shortID.index = 89; // Is this now reflected everywhere? OR was the shortID struct only modified in the scope of this funciton..
}

void function2()
{
Square *someSquare = GetSquare(1);
if ( someSquare->shortID.index != 89 )
{
// Dang...
}
}

Спасибо!

РЕДАКТИРОВАТЬ:

Спасибо за краткие ответы, да, функция GetSquare возвращает указатель на указанный индекс массива квадратов. Вот так:

Square* GetSquare( uint8_t index )
{
return &squares[index];
}

Таким образом, экземпляр должен быть одинаковым каждый раз, так как массив «квадраты» выделяется один раз при создании объекта. Так что спасибо за ваше понимание, моя проблема должна быть в другом месте в моем коде 🙂

2

Решение

да, потому что someSquare это Square*
-> Оператор как (*varname). ,
Так что это содержимое указателя, и вы получите тип Square,
Затем вы можете просто изменить переменную с . потому что это структура и все переменные общедоступны, а не в классах.

Изменения, которые вы сделали в function1, можно увидеть в function2, если GetSquare возвращает тот же объект, который может иметь место, если ваш GetSquare выглядит так

Square * GetSquare(int i)
{
static Square * pSquare = 0;
if (pSquare)
pSquare = malloc(sizeof(static Square));
return pSquare;
}

или для глобальных переменных, как это

static Square pSquare ;

Square * GetSquare(int i)
{
return &pSquare;
}
2

Другие решения

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

Если указатели указывают на разные экземпляры, вы не увидите значение.

Как указывает juanchopanza, все зависит от того, что делает ваша функция GetSquare. Пожалуйста, опубликуйте определение этой функции.

1

Это будет в области, потому что вы не используете какую-либо форму глобального экземпляра. Я не знаю, что на самом деле делает getSquare, но я предполагаю, что он создает экземпляр класса Square и возвращает экземпляр …

0

Доступ к someSquare->someID.index это как доступ someSquare->x — в обоих случаях он изменяет объект, на который указывает someSquare (в первом случае это изменение подобъекта).

0

Да, если GetSquare (1) возвращает тот же экземпляр, то изменение также должно быть отражено в функции function2 ().
Если вы хотите быть уверены, что возвращаемый экземпляр совпадает, попробуйте напечатать значение указателя someSquare следующим выражением:

printf("Value of pointer: %p \n",someSquare);

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

Также GetSquare должен быть глобальной функцией вне какого-либо класса или статической функцией. Если это функция экземпляра, то она получит доступ к различным массивам класса «Квадрат» для различных объектов класса.

Кроме этого, я не мог бы дать другое мнение на основе доступного кода.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector