【问题标题】:Pointers,constants and Type aliasis指针、常量和类型别名
【发布时间】:2016-06-09 04:50:44
【问题描述】:

以下有什么区别:

const char *c = 0; //Here c is a pointer to a constant character

typedef char *pstring;
const pstring cstr = 0 //cstr is a constant pointer to a character

为什么这两个语句之间有区别,而它们看起来完全一样。在 C++ Primer 中提到第一个语句的基本类型是 const char 而 * 是声明符的一部分。而对于最后一条语句,基本类型是 const pstring。我不明白两者之间的区别。

【问题讨论】:

  • pstring 是指向 char 的指针,因此 const pstring 是指向 char 的 const 指针。

标签: c++ pointers constants


【解决方案1】:

我认为您的困惑源于不了解顶级const。当您有typedef 时,您不能将const 添加到基础类型,只能在其上方。

const pstring pconst char *p 不同,即typedefs 不是宏替换。一旦typedefed 类型是原子的; const 在哪里并不重要,无论是在 constness 与完整类型相关联的类型的左侧还是右侧,在本例中为 char*

typedef char* pstring;
const pstring p1;  // const pointer to char i.e. char* const
pstring const p2;  // const pointer to char i.e. char* const

如果你把原来的类型写成这样,那么意思就会改变。

const char* p1;  // pointer to const char
char* const p2;  // const pointer to char

What are top-level const qualifiers?阅读以了解更多信息。

【讨论】:

    【解决方案2】:

    从右到左阅读指针声明有助于理解它们。

    第一个是指向 const 的 char 的指针。您不能修改它指向的 char,因为 char 是 const。

    第二个是指向 char 的 const 指针。您不能修改指针的值(它指向的字符的位置),因为 pointer 是 const。

    typedef char* pstring 之后(最好将星号从类型名中移开,因为它不是其中的一部分),常量适用于它创建的类型,就像它适用于其他所有内容一样:

    int i;
    const int i = 0; // actually int const i = 0
    
    char* p;
    const char* p = 0; // actually char const* p = 0
    
    typedef char* pstring;
    const pstring ps = 0; // actually 'pstring const' -> 'char* const' ps = 0
    

    正是由于这个原因,一些编码标准(例如 MISRA)要求您将 cv 限定符放在类型名称之后,因为它更好地表明 const-ness 限定类型,它依赖于它 - 而不是其他方式。

    【讨论】:

    • @NamanSharma 不客气。:) 如果您觉得它有帮助,请考虑支持/接受。谢谢!
    【解决方案3】:
    const char *c = 0;
    

    这将c 声明为指向const char 的指针。您无法通过c 更改c 指向的内容。但是c 可以指向不同的字符串。

    char arr[] = "test";
    c = arr; // OK
    

    另一方面。

    typedef char *pstring;
    const pstring cstr = 0;
    

    cstr 声明为const 指向char 的指针。您可以更改 cstr 指向的内容,但不能更改 cstr 指向的位置。如果没有typedef,您将使用:

    char* const cstr = 0;
    

    不幸的是,该语言允许将const 放在基本类型之前。使用起来会更清晰:

    char const* c = 0;     // what c points to is const
    

    从右到左阅读。 c 是指向 const char 的指针。

    char* const cstr = 0;  // the pointer is const
    

    从右到左阅读。 c 是一个指向 charconst 指针。

    IMO,指针的const-ness 和它指向的对象在上面更清晰。

    【讨论】:

    • 我知道常量指针和指向常量字符的指针之间的区别。问题是当我们使用 : typedef int num 时,每次出现的 int 都会被 num 替换。所以现在如果我们写 typedef char * pstring ,那么语句 const pstring 将是 const char* (我刚刚用 char * 替换了 pstring,这里有什么问题)
    • @NamanSharma,然后每次出现的 int 都被替换为 num。 有点正确。这不像宏替换。
    • 所以你的意思是我们实际上并没有替代,它只是一种写作方式。但是在指针的情况下会令人困惑。
    • @NamanSharma,typedef 被视为该类型的别名。在您的情况下,如果您可以将char* 组合成一个类型,const pstring 将类似于const "char*",而不是"const char"*
    猜你喜欢
    • 2015-04-26
    • 2020-10-23
    • 2018-12-04
    • 2011-08-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多