【问题标题】:Why would a function use the "address of" operator on an argument passed to it as a pointer?为什么函数会在作为指针传递给它的参数上使用“地址”运算符?
【发布时间】:2019-01-28 17:00:43
【问题描述】:

我是 C 编程语言的新手,我试图理解一个函数的意图,该函数接受一个指针参数,但在其上使用运算符的地址,就好像它是函数体中的变量名一样?传递的参数是结构类型。也就是说,为什么作者选择使用 &lib -> fatfs;而不是 lib->fatfs? “地址”运算符是否用于确保不传递空指针?

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

    f_mount(0, &lib->fatfs);

    disk_initCallBack(interface);
}

【问题讨论】:

  • 可能是因为lib->fatfs是一个非指针对象,而f_mount函数期望传入一个指针?
  • 这也可能是一种在C中模拟通过引用传递的方法?

标签: c


【解决方案1】:

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

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

【讨论】:

  • 哇,非常感谢,我完全错过了优先级的可能性。你能多说一下作者为什么想要 &(lib->fatfs) 地址吗?这是否允许作者将地址绑定到他们自己的内部指针,以将逻辑名称映射到物理名称?
  • @user3062695 我真的不能说,因为这段代码的上下文很少。
【解决方案2】:

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

【讨论】:

  • 谢谢。我完全错过了优先顺序。您能多说一下作者在此声明中的意图吗?
猜你喜欢
  • 2021-12-27
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 2014-06-06
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
相关资源
最近更新 更多