首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么函数要在传递给它的参数上使用"address of“运算符作为指针?

为什么函数要在传递给它的参数上使用"address of“运算符作为指针?
EN

Stack Overflow用户
提问于 2019-01-29 01:00:44
回答 2查看 64关注 0票数 1

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

代码语言:javascript
代码运行次数:0
运行
复制
void SDCardLib_init(SDCardLib * lib, SDCardLib_Interface * interface)
{
    lib->interface = interface;

    f_mount(0, &lib->fatfs);

    disk_initCallBack(interface);
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-29 01:05:33

address-of运算符未应用于指针lib,而是应用于指向对象的fatfs成员。与一元&运算符相比,->运算符具有更高的优先级。

这意味着&lib->fatfs&(lib->fatfs)是相同的。这应该会让&获取的地址变得更加清晰。

票数 5
EN

Stack Overflow用户

发布于 2019-01-29 01:05:25

&lib->fatfs&(lib->fatfs)&((*lib).fatfs)相同。&不接受名为lib的指针的地址。

&lib->fatfs本质上是lib指向的任何值加上fatfs成员所处的偏移量。

下面的代码断言:

代码语言:javascript
代码运行次数:0
运行
复制
//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) );
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54406874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档