0
typedef int* ptr_t;
int target;
const ptr_t a = ⌖
*a = 6;            //OK
a = &target;       //<- error: assignment of read-only variable ‘a’

显然,指针是常量,而不是指向的值。如果使用#define,则相反。

将修饰符应用于在 typedef 中声明的指针的规则是什么?

举一个实际的例子,考虑代码 void (**foo)(void);

  • 如何对一个类型进行类型定义,将顶级指针限定为 const(例如指向硬件位置),将下一个指针限定为指向函数的 volatile(例如,可由独立硬件修改)指针?

  • typedef void (**foo)(void)如果这是我们必须使用的固定声明,我们应该在源代码中进行上述操作吗?

4

2 回答 2

3

规则是:

  • typedef不是像宏那样的纯文本替换。
  • 声明不解析看typedef中涉及到指针
  • cv 限定符适用于您使用 typedef 创建的同义词,即:int *

所以,

typedef int* ptr_t;
const ptr_t a = &target;

不一样:

const int* a;

但它与以下内容相同:

int *const a;

换句话说,First 声明了一个指向 int 的 const 常量指针,而不是像 second 中那样指向常量 int 的指针。

正如您刚刚从示例中注意到的那样,指针
是一种不好的做法,因为它降低了代码的可读性和直观性。typedef即,在使用 typedef 作为指针时很容易产生错误。最好避免它。

于 2013-04-28T12:46:16.143 回答
3

C 标准的第 6.7.5.1 节描述了差异。它举了一个例子:

const int *ptr_to_constant;
int *const constant_ptr;

并说:

所指向的任何对象的内容ptr_to_constant都不应通过该指针进行修改,但ptr_to_constant可以将其自身更改为指向另一个对象。类似地,by 所int 指向的内容constant_ptr可能会被修改,但constant_ptr它本身应始终指向同一个位置。

最后,该部分的第 4 点描述了 typedef 的使用。

常量指针的声明constant_ptr可以通过包含类型''pointer to int''的定义来阐明。

  typedef int *int_ptr;
  const int_ptr constant_ptr;

声明constant_ptr为类型为“指向 int 的 const 限定指针”的对象。

于 2013-04-28T12:56:08.053 回答