繁体   English   中英

验证双指针 function 参数中 const 的正确使用

[英]Verify proper use of const in double pointer function parameter

这个问题基于我为这篇文章制作的以下 C 示例:

#include <stdio.h>
#include <stdint.h>

typedef struct 
{
    uint32_t temp;
    uint32_t temp2;
} Foo_t;

static void doFoo(const Foo_t *fooAPtr, const Foo_t **fooBPtr);

static void doFoo(const Foo_t *fooAPtr, const Foo_t **fooBPtr)
{
    /* Assinging B to A just as an example */
    *fooBPtr = fooAPtr;
}

int main()
{
    Foo_t fooA = {1, 2};
    Foo_t *fooAPtr = &fooA;
    const Foo_t *fooBPtr = 0;

    doFoo(fooAPtr, &fooBPtr);

    printf("\n FooAPtr == %p, FooBPtr == %p \n", fooAPtr, fooBPtr);

    printf("\n FooAPtr == %i %i |_| FooBPtr == %i %i \n", fooAPtr->temp, fooAPtr->temp2, fooBPtr->temp, fooBPtr->temp2);

    return 0;
}

这段代码可以在下面的链接中运行:

https://onlinegdb.com/rJdHGFNYB

我在质疑我的指针逻辑,并想验证我对代码的假设。 这是我对上面的 doFoo() function 的解释:

fooAPtr == 一个常量指针,指向 Foo_t 类型结构的 memory 位置。 const 表示不应更改该 memory 位置的地址

fooBPtr == 一个可变指针,指向指向 Foo_t 结构的 memory 位置的地址。 const 表示指向的地址不能改变?

我问这个很可悲,但我无法理解特定的用例。 代码按预期工作,但这并不意味着它是正确的。

所以,问题是,我对上述指针逻辑的解释是否正确? 具体来说,我对 const 的使用,以及 fooBPtr 的间接层。 对于上下文,doFoo() 的目标是通过 function 参数将 fooBPtr 分配给 fooAPtr,而不是通过返回任何内容。

术语“常量指针”没有帮助,因为它有多种解释。

  • fooAPtr是一个指向只读数据的指针。 指针本身可以更改。
  • fooBPtr是指向只读数据的指针。 指针对指针本身可以更改。 可以更改指向的指针。

请注意,在这种情况下, const坚持指向的数据。 从右到左阅读声明可能会有所帮助。

更多信息: const int*、const int * const 和 int const * 有什么区别?

const Foo_t *fooAPtrfooAPtr指向一个const Foo_t Foo_t const * fooAPtr

Foo_t * const fooAPtrfooAPtrconst并指向Foo_t

const Foo_t **fooBPtrfooBPtr指向一个指向const Foo_t的指针。

foo_t const **fooBPtr还说fooBPtr指向一个指向const Foo_t的指针。

foo_t * const *fooBPtr表示fooBPtr指向一个指向Foo_tconst指针。

Foo_t ** const fooBPtrfooBPtrconst并指向一个指向Foo_t的指针。

实际上,在两个指针声明中, const指的是不允许更改 Foo_t 类型的Foo_t占用的 memory 区域这一事实。

  • const Foo_t *fooAPtr : 指向const Foo_t的指针;
  • const Foo_t **fooBPtr :指向const Foo_t的指针。

如果您想将fooBPtr指向的指针转换为 const,则必须将其声明更改为:

const Foo_t * const * fooBPtr;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM