typedef-ed指针如何工作

时间:2013-04-28 12:41:09

标签: c typedef

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(例如可通过独立硬件修改)指向a功能

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

2 个答案:

答案 0 :(得分:3)

规则是:

  • typedef不像宏一样纯文字替代。
  • 未解析声明以查看typedef
  • 中是否涉及指针
  • cv限定符适用于您使用typedef创建的同义词,即:int *

所以,

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

与:

不同
const int* a;

但它与:

相同
int *const a;

换句话说,首先声明一个指向int的const常量指针,而不是指向常量int的指针,如第二个。

正如你刚才从你的例子中注意到的那样, typedef指针是一种不好的做法,因为它会降低代码的可读性和直观性。它就是在使用typedef作为指针时很容易创建错误。最好避免它。

答案 1 :(得分:3)

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

const int *ptr_to_constant;
int *const constant_ptr;

并说:

  

ptr_to_constant指向的任何对象的内容不得   通过该指针修改,但ptr_to_constant本身可能是   改为指向另一个对象。同样,int的内容   constant_ptr指向的内容可能会被修改,但constant_ptr本身可能会被修改   应始终指向同一地点。

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

  

可以澄清常量指针constant_ptr的声明   通过包含类型''指向int''的定义。

  typedef int *int_ptr;
  const int_ptr constant_ptr;
  

constant_ptr声明为具有类型'const-qualified的对象   指向int''的指针。