繁体   English   中英

指针,常量和类型别名

[英]Pointers,constants and Type aliasis

以下内容有什么区别:

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。 我没有得到两者之间的区别。

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

const pstring pconst char *ptypedef不是宏替换。 一旦typedef编类型是原子; 它没有身在何处的const ,它是向左或向右类型的const内斯与完整的类型相关联,在这种情况下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

什么是顶级const限定词? 阅读以了解更多信息。

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

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

第二个是指向char的const指针。 您不能修改指针的值(它指向的char的位置),因为指针是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限定类型,它取决于类型,而不是相反。 。

const char *c = 0;

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

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

另一方面。

typedef char *pstring;
const pstring cstr = 0;

声明cstr是指向char const指针。 您可以更改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在上面已经很清楚了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM