函数为什么要在传递给它的参数上使用“地址”运算符作为指针?

时间:2019-01-28 17:00:44

标签: c

我是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 :(得分:5)

地址运算符未应用于指针lib,而是应用于指向对象的fatfs成员。 ->运算符的优先级高于一元&运算符。

这意味着&lib->fatfs&(lib->fatfs)相同。这样应该更清楚&接收的地址是什么。

答案 1 :(得分:4)

&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) );
}