我是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);
}
答案 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) );
}