[英]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 p
与const char *p
即typedef
不是宏替换。 一旦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
是指向char
的const
指针。
IMO,指针和它指向的对象的const
在上面已经很清楚了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.