[英]Double pointer conversions, passing into function with `const void **ptr` parameter
[英]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 Foo_t *fooAPtr
说fooAPtr
指向一个const Foo_t
。 Foo_t const * fooAPtr
。
Foo_t * const fooAPtr
说fooAPtr
是const
并指向Foo_t
。
const Foo_t **fooBPtr
说fooBPtr
指向一个指向const Foo_t
的指针。
foo_t const **fooBPtr
还说fooBPtr
指向一个指向const Foo_t
的指针。
foo_t * const *fooBPtr
表示fooBPtr
指向一个指向Foo_t
的const
指针。
Foo_t ** const fooBPtr
说fooBPtr
是const
并指向一个指向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.