是否有替代语法来初始化指向常量数据的常量指针?

问题描述 投票:0回答:2

我有一个嵌入式 C 软件,需要多个指向 const 数据的 const 指针。到目前为止,我一直在重复两行代码来初始化它们:

const int data = 0xF0; // const int
const int* const buffer = &data; // const pointer to const int

之前我使用了很多类型转换,但在队友审核时发现太容易出错。如果我能找到一种清晰一致地使用它们的方法,我愿意使用它们。 我还需要避免在传递给函数时丢弃我的

const
限定符,因为丢弃它实际上已经导致了开发中的一个错误。

c pointers initialization
2个回答
2
投票

使用复合文字:

const int * const buffer = (const int []) { 0xF0 };

或:

const int * const buffer = & (const int) { 0xF0 };

2
投票

您可以在单个声明中定义指针和数据(尽管不可读且不推荐:

const int data = 0xF0, * const buffer = &data;

使用C99复合文字,你还可以写:

const int * const buffer = (const int[]){ 0xF0 };

const int * const buffer = (const int[1]){ 0xF0 };

const int * const buffer = &(const int){ 0xF0 };

请注意,

const
int
关键字的顺序并不重要,将
const
关键字更靠近其限定的
*
可能会更具可读性:

int const * const buffer = (int const []) { 0xF0 };

问题是:为什么需要指针?如果指针是常量,则无法将其更改为指向其他内容,因此当您可以直接传递

&data
时为什么还要定义指针?

删除函数调用的

const
限定符表明存在设计缺陷:采用指向它未修改的数据的指针的函数应将参数定义为
whatevertype const *arg
,并且在传递地址时不需要任何强制转换数据,无论
const
合格与否。 如果函数确实修改了它获取的指针所指向的数据,则向其传递定义为
const
的数据将在修改时触发未定义的行为,因为数据可能位于只读存储器中。

© www.soinside.com 2019 - 2024. All rights reserved.