我是C编程语言的新手,我试图理解一个函数的意图,这个函数接受一个指针参数,但在它上面使用运算符的地址,就好像它是函数体中的一个变量名一样。传递的参数是struct类型。换句话说,为什么作者选择使用&lib -> fatfs;而不是lib->fatfs?"address of“运算符是否用于确保不传递空指针?
void SDCardLib_init(SDCardLib * lib, SDCardLib_Interface * interface)
{
lib->interface = interface;
f_mount(0, &lib->fatfs);
disk_initCallBack(interface);
}
发布于 2019-01-28 17:05:33
address-of运算符未应用于指针lib
,而是应用于指向对象的fatfs
成员。与一元&
运算符相比,->
运算符具有更高的优先级。
这意味着&lib->fatfs
与&(lib->fatfs)
是相同的。这应该会让&
获取的地址变得更加清晰。
发布于 2019-01-28 17:05:25
&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) );
}
https://stackoverflow.com/questions/54406874
复制