Недавно я нашел способ перебирать структуры, как если бы они были массивом (при условии, что тип значения одинаков во всех членах структуры), и он работает так, как я ожидаю и хочу этого. Однако у меня возникают проблемы с пониманием , почему это работает. Не понимая, почему это работает, я не чувствую себя комфортно, поэтому я надеялся, что сообщество сможет мне помочь. Ниже приведен некоторый код.
StructName - это обобщенное c имя для моей структуры многих значений с плавающей запятой, а iterate - обобщенное c имя функции. Пожалуйста, обратите внимание на отмеченную строку, так как это то, где я запутался в ее работе.
void iterate(StructName *s){
//some code
float *a;
a = (float*)&*s; //<---This line
//some more code
a++; //gets next struct member
}
Это работает, как и ожидалось, я могу перебирать свою структуру как массив. Если я сделаю следующее (удалите (float *) из отмеченной строки):
void iterate(StructName *s){
//some code
float *a;
a = &*s; //<---This line
//some more code
a++; //gets next struct member
}
, я получу следующее предупреждение:
warning: assignment to 'float *' from incompatible pointer type 'StructName *' {aka 'struct <anonymous> *'} [-Wincompatible-pointer-types]
a = &*s;
Но код по-прежнему компилируется и запускается как ожидается.
И затем, если я сделаю следующее (уберите звездочку из отмеченной строки):
void iterate(StructName *s){
//some code
float *a;
a = (float*)&s; //<---This line
//some more code
a++; //gets next struct member
}
Моя индексация в значительной степени компенсируется, казалось бы, случайной величиной.