typedef用法疑惑

#include <iostream>
#define INTPTR1 int *
typedef int * INTPTR2;

using namespace std;

int main()
{
    INTPTR1 p1, p2; // p1: int *; p2: int
    INTPTR2 p3, p4; // p3: int *; p4: int *

    int var = 1;
    const INTPTR1 p5 = &var; // 相当于 const int * p5; 常量指针,即不可以通过 p5 去修改 p5 指向的内容,但是 p5 可以指向其他内容。
    const INTPTR2 p6 = &var; // 相当于 int * const p6; 指针常量,不可使 p6 再指向其他内容。
    int a = 10;
    p6 = &a;
    return 0;
}

const INTPTR2 p6 为啥相当于 int * const p6呢?

阅读 2.3k
3 个回答

const INTPTR2 p6 = &var;INTPTR2 const p6 = &var;是等价的
int * const p6 = &var;const修饰的是p6,所以p6的值不能更改,也就是不能使p6指向其他内容。同样的INTPTR2 const p6 = &var;const修饰的也是p6

首先要理解c++的顶层/底层const的概念:

const T * == (const T) * //底层const
T * const == (T *) const //顶层const

INTPTR1基于宏定义,而c++中的宏定义在预处理阶段运行,因此p5的类型是:const int *,即底层const。
INTPTR2基于typedef定义,并不是简单的文本替换,typedef int * INTPTR2 首先将*作用于int,生成了一种新的类型int*,然后const INTPTR2 相当于const作用于该新类型,即const (T *),但是c++中没有这种语法,等价的表达是T * const,即顶层const。
参考:https://zh.cppreference.com/w...

这里typeof 相当于一个括号作用,即强制先结合一定的关系,比如这里

define INTPRT1 int *;
define INTPRT3 (int *);
typeof int * INTPRT2;
int var=1
const INTPRT1 p5=&var;// const int * p5=&var;
const INTPRT2 p6=&var;// const (int *) p6=&var;  等效 (int *) const p6=&var
const INTPRT3 p7=&var; // 等效于 INTPRT2 的定义啦。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题