typedef int* ptr_t;
int target;
const ptr_t a = ⌖
*a = 6; //OK
a = ⌖ //<- error: assignment of read-only variable ‘a’
显然,指针是常量,而不是指向的值。如果使用#define则相反。
将修饰符应用于指针的规则是什么,在typedef中声明?
对于实际示例,请考虑代码
void (**foo)(void);
如何进行类型定义,将顶级指针限定为const(例如指向硬件位置),下一个指针为volatile(例如可通过独立硬件修改)指向a功能
typedef void (**foo)(void)
如果这是我们必须使用的固定声明,那么在源代码中执行上述操作是什么?
答案 0 :(得分:3)
规则是:
typedef
不像宏一样纯文字替代。int *
。 所以,
typedef int* ptr_t;
const ptr_t a = ⌖
与:
不同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''的指针。