免费行情软件网站下载大全爱,怎么做产品网站,安徽网站优化多少钱,网页网站开发项目设计先看下面六种写法#xff1a; 1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p; 那么我们应该怎么区分上面的写法到底是指向常量的指针还是const指针(表示指针本身是常量)呢#xff1f; 一个简便方法#…先看下面六种写法 1. const int p;2. const int *p;3. int const* p;4. int * const p;5. const int * const p;6. int const * const p; 那么我们应该怎么区分上面的写法到底是指向常量的指针还是const指针(表示指针本身是常量)呢 一个简便方法从由往左读遇到p就替换为“p is a”遇到*就替换为“point to”其余不变。 下面我们来一个一个看 1. const int p; // p is a int const. p是一个int型常量 这个很简单2. const int *p; //p is a point to int const. p是一个指针指向int型常量。即p是一个指向int型常量的指针。3. int const* p; //与2相同 const int 和 int const 是一样的意思。《C primer》中采用第一种写法。4. int * const p; // p is a const point to int. p是一个指向int的const指针5. const int * const p; //p is a const point to int const. p是一个指向int型常量的const指针。6. int const * const p; //同5 知道怎么区分const指针和指向常量的指针我们再来看看它们的定义。 指向常量的指针point to cosnt不能用于改变其所指对象的值。比如 const double pi 3.14; // pi是一个常量不能改变它的值const double *cptr pi; //cptr指向pi,注意这里的const不能丢因为普通指针不能指向常量*cptr 3.33; //错误,试图改变所指对象的值。不能给*cptr赋值即不能改变指针所指对象的值cout cptr endl//输出cptr的值//虽然不能改变其所指对象的值但是它可以指向别的常量对象
//这样的话 指针的值也就是存放在指针中的那个地址也会改变 比如
cosnt double pi2 6.28;cptr pi2; //正确 *cptr为6.28 cout cptr endl //cptr的值变了 const指针表示指针本身是一个常量。由于指针是对象因此就像其他对象一样允许把指针本身定为常量。cosnt指针必须初始化并且一旦初始化const指针的值就不能改变了。const指针的值到底是什么其实就是存放在指针中的地址这个地址是一个对象的地址。 把*放在const前面就表示指针是一个常量这样的书写形式意味着不变的是指针本身的值而不是指向的对象的值内容。也就是说那个地址不能再变了但是我们可以改变那个地址上存放的内容。比如 int i 42;int * cosnt p i //p是一个const指针不能给p赋值cosnt int i2 44;p i2; //错误 试图给p赋值//虽然不能给p赋值也就是不能改变p的值但是我们可以通过p改变p所指的对象的内容。比如*p 46; //正确 此时i为46 指针本身是一个常量即const指针并不意味着不能通过指针修改其所指对象的值能否这样做完全依赖于所指对象的类型。比如 const double pi 4.4;const double *const pip pi; //pip是一个指向常量对象的const指针还记得文章开头的方法吗。 pip是一个指向常量的常量指针则不论pip所指的对象值还是pip自己存储的那个地址都不能改变。相反上例中的p指向的是一般的非常量整数所以p可以修改i的值。 完整代码 #include iostream
using namespace std;int main(int argc, char const *argv[])
{const int b 11;const int *p2 b; //指向常量的指针 底层const 不能改变p2的所指对象的值 但是可以改变p2的值即指针的指向 前提是仍然指向一个常量cout *p2 endl; //11cout p2 endl; //0x72fe38const int c 22;p2 c;cout *p2 endl; //22cout p2 endl; //0x72fe34地址发生了改变int i 9;int *const p1 i; //指针是一个常量即常量指针顶层const 不能改变p2的值存放在p2中对象的地址 但是可以改变对象的内容cout p1 endl; //0x72fe3c 这个地址不会再改变了*p1 88;cout i endl; //88cout *p1 endl; //88cout p1 endl; //0x72fe3creturn 0;
} 对于指针来说顶层const表示指针本身是一个常量底层const表示指针所指的对象是一个常量。所以const指针是顶层cosnt而指向常量的指针是底层const。 转载于:https://www.cnblogs.com/bencai/p/8888760.html