如何获得指向const结构体的const指针?

azpvetkf  于 2022-12-03  发布在  其他
关注(0)|答案(2)|浏览(161)

我喜欢在我的代码中创建这样的场景:我在一个.c文件中声明一个静态全局结构体,每个人都可以共享它,它包含配置信息。在声明的正下方,我将创建一个指向该结构体的常量指针,并将其放在.h文件中,以便每个人都可以访问它。
有时候,在一个.c文件中,我希望有一个指向该.c文件所关心的特定配置的全局指针,这样我就不必不断地引用全局结构体,因为有时候我会从不同项目的不同源中获取此配置。
我遇到的问题是我不能定义这个“local global”指针,因为初始化器元素不是常量。

typedef struct
{
    int Value;
} mystruct_t, *pmystruct_t;

static const mystruct_t GlobalStruct;
const pmystruct_t pGlobalStruct = &GlobalStruct;

const int *ValuePtr = &pGlobalStruct->Value;

int main()
{
    *ValuePtr = 10;

    return 0;
}

我试着阅读C语言中指针的const关键字,我想我理解了它,但显然它对我来说仍然是一个谜。我尝试的代码行,可能会让我更接近要编译的代码段是

const mystruct_t const *pGlobalStruct = &GlobalStruct;

但是,它仍然不能编译,因为ValuePtr初始化器元素不是常量(我得到的错误)。
这里的最终目标是使ValuePtr成为一个常量,其中没有人可以更改它所指向的位置,但允许更改它所指向的结构体的元素。
编辑:我希望ValuePtr使用pGlobalStruct

hgqdbh6s

hgqdbh6s1#

定义

const pmystruct_t pGlobalStruct = &GlobalStruct;

使变数(指标本身)pGlobalStruct成为常数,而不是它所指向的结构。
这只是将指针隐藏在类型别名后面的众多缺陷中的 * 一个 *。
要使ValuePtr的定义也有效,则需要使指针变量以及它所指向的结构都为常量:

const mystruct_t * const pGlobalStruct = &GlobalStruct;

现在pGlobalStruct是指向常量mystruct_t对象的常量指针。

sulc1iza

sulc1iza2#

不要隐藏typedef后面的指针。
如果您的指针正在引用常量对象,则不能为其赋值。您只能初始化该对象。

const int x = 10;   //initialization
cosnt int *ptr = &x;

如何获得指向const结构体的const指针?以下是所有可能的组合:

struct str
{
    int x;
    float b;
};

struct str a;
const struct str b;
const struct str *c;
struct str * const d;
const struct str * const e;
  • a-不是const结构
  • b-const结构
  • c-不是指向const结构的const指针
  • d-const指向非const结构的指针
  • 指向const结构的指针

就你而言

const mystruct_t * const pGlobalSttruct = &GlobalStruct;

相关问题