Почему функция использует оператор "address of" для аргумента, переданного ей в качестве указателя? - PullRequest
0 голосов
/ 28 января 2019

Я новичок в языке программирования C и пытаюсь понять назначение функции, которая принимает аргумент-указатель, но использует адрес оператора в нем, как если бы это было имя переменной в теле функции?Передаваемые параметры имеют тип struct.Другими словами, почему автор решил использовать & lib -> fatfs;вместо lib-> fatfs?Используется ли оператор «адрес», чтобы гарантировать, что нулевой указатель не передается?

void SDCardLib_init(SDCardLib * lib, SDCardLib_Interface * interface)
{
    lib->interface = interface;

    f_mount(0, &lib->fatfs);

    disk_initCallBack(interface);
}

Ответы [ 2 ]

0 голосов
/ 28 января 2019

Оператор address-of применяется не к указателю lib, а к элементу fatfs указанного объекта.Оператор -> имеет более высокий приоритет, чем унарный оператор &.

Это означает, что &lib->fatfs совпадает с &(lib->fatfs).Это должно прояснить, что & берет адрес.

0 голосов
/ 28 января 2019

&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) );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...