Имея некоторые опасения по поводу функциональности ссылки на член и операторов указателя.
Возьмите следующий пример:
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];
}
Таким образом, экземпляр должен быть одинаковым каждый раз, так как массив «квадраты» выделяется один раз при создании объекта. Так что спасибо за ваше понимание, моя проблема должна быть в другом месте в моем коде 🙂
да, потому что 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;
}
Если указатель Square в function1 указывает на тот же квадрат, что и указатель Square в function2, тогда да, вы увидите значение, установленное в function1 в function2 (при условии, что функции вызываются в этой последовательности).
Если указатели указывают на разные экземпляры, вы не увидите значение.
Как указывает juanchopanza, все зависит от того, что делает ваша функция GetSquare. Пожалуйста, опубликуйте определение этой функции.
Это будет в области, потому что вы не используете какую-либо форму глобального экземпляра. Я не знаю, что на самом деле делает getSquare, но я предполагаю, что он создает экземпляр класса Square и возвращает экземпляр …
Доступ к someSquare->someID.index
это как доступ someSquare->x
— в обоих случаях он изменяет объект, на который указывает someSquare
(в первом случае это изменение подобъекта).
Да, если GetSquare (1) возвращает тот же экземпляр, то изменение также должно быть отражено в функции function2 ().
Если вы хотите быть уверены, что возвращаемый экземпляр совпадает, попробуйте напечатать значение указателя someSquare следующим выражением:
printf("Value of pointer: %p \n",someSquare);
Если это значение одинаково, это означает, что они являются одинаковыми экземплярами, и изменение должно быть отражено в функции 2 ().
Также GetSquare должен быть глобальной функцией вне какого-либо класса или статической функцией. Если это функция экземпляра, то она получит доступ к различным массивам класса «Квадрат» для различных объектов класса.
Кроме этого, я не мог бы дать другое мнение на основе доступного кода.