&lib->fatfs
совпадает с &(lib->fatfs)
или &((*lib).fatfs)
.&
не принимает адрес указателя с именем lib
.
&lib->fatfs
- это, по сути, все, на что lib
указывает плюс любое смещение, к которому относится элемент fatfs
.
Следующий фрагмент кода утверждает, что:
//imagine a fake SDCardLib
typedef long sometype;
typedef struct {
int something0;
sometype fatfs;
int something1;
} SDCardLib;
#undef NDEBUG //make sure asserts are kept
#include <assert.h>
#include <stddef.h> //offsetof
#include <stdlib.h> //malloc
int main()
{
SDCardLib *lib = malloc(sizeof *lib);
if(!lib) return 1;
assert( &lib->fatfs ==
(sometype*) ((char*)lib + offsetof(SDCardLib,fatfs)) );
assert( &lib->fatfs == &(lib->fatfs) );
assert( &lib->fatfs == &((*lib).fatfs) );
}