自我理解:const char*, char const* and char *const
下邊是網上收集到的
const char*, char const*, char*const的區別問題幾乎是C++面試中每次都會有的題目。
事實上這個概念誰都有只是三種聲明方式非常相似很容易記混。
Bjarne在他的The C++ Programming Language里面給出過一個助記的方法:
把一個聲明從右向左讀。
char? * const cp; ( * 讀成 pointer to )
cp is a const pointer to char
const char * p;
p is a pointer to const char;
char const * p;
同上因為C++里面沒有const*的運算符,所以const只能屬于前面的類型。
?
下面定義的一個指向字符串的常量指針:
char * const prt1 = stringprt1;
其中,ptr1是一個常量指針。因此,下面賦值是非法的。
ptr1 = stringprt2;
而下面的賦值是合法的:
*ptr1 = "m";
因為指針ptr1所指向的變量是可以更新的,不可更新的是常量指針ptr1所指的方向(別的字符串)。
下面定義了一個指向字符串常量的指針:
const * ptr2 = stringprt1;
其中,ptr2是一個指向字符串常量的指針。ptr2所指向的字符串不能更新的,而ptr2是可以更新的。因此,
*ptr2 = "x";
是非法的,而:
ptr2 = stringptr2;
是合法的。
所以,在使用const修飾指針時,應該注意const的位置。定義一個指向字符串的指針常量和定義一個指向字符串常量的指針時,const修飾符的位置不同,前者const放在*和指針名之間,后者const放在類型說明符前。
看了之后終于恍然大悟:
????? 其實就2種說法:
以下貼出本人在VS 2008里做的測試代碼?
不對指出大家可以指出,謝謝
?
Code#include?"stdafx.h"
#include?<iostream>
#include?"stdio.h"
using?namespace?std;
int?_tmain(int?argc,?_TCHAR*?argv[])
{
????/**************第一種情況開始***********/
????//?指針所指向的內容是只讀的。
?????????int?tt=3;
????????//賦了初值,?tt也可以是const?int?tt
????????const?int?*a=&tt;
????????
????????//?*a=5;??//a所指向的值不可以改變了,所以這行會編譯出錯
?????????
?????????cout<<*a<<endl;
????????
????????int?t1=9;
????????a=&t1;???????//改變地址或指針是可以的。
????????
????/**************第一種情況結束***********/
???
???
???
????/**************第二種情況開始***********/
????????//?這個和上面的一樣
?????????int?const?*??bb?=?&tt;
?????????
?????????cout<<*bb<<endl;
?????????
??????????int?ddx=8;
?????????
?????????bb=&ddx;??//注意,這改變的是指針,所以可以通過編譯
?????????
?????????cout<<*bb<<endl;
?????/**************第二種情況結束***********/
?????
?????/**************第三種情況開始***********/
?????????/*
????????????指針是只讀的
?????????*/
????????
?????????int??*?const?cc?=?&tt;??//?const指針b?賦初值?,但如果?tt是?const?int?tt?則會報錯;
?????????cout<<*cc<<endl;??//輸出tt?3
?????
?????????*cc=6;?//更改cc所指向的內容,合法
??????????cout<<*cc<<endl;??//輸出tt?3
?????????//cc=&ddx;?//這試圖改變cc所指向的地址,是不合法的,
?????
????????//?以下試圖構造指針p_dd并賦值給cc,會出錯?????????????????????????????????????????????????????????????????????*/
????????//int?dd=8;
????????//int*?p_dd=ⅆ
????????//cc=p_dd;
?????/**************第三種情況結束***********/
????
????
????/***************第四種情況開始***********/
????//指針和指針說指向的內容都是只讀的。。。
????????const?int?ttt=1;???
????????const?int?*?const?ee=&ttt;?//賦的值也必須是只讀的。
????????
????????//以下都會出錯
????????//ee=&tt;?????????//改變地址,不合法
????????//*ee=tt;?????????//改變指針的內容,也不合法
?????/*************第四種情況結束************/????
?????
????getchar();
????return?0;
}
?
轉載于:https://www.cnblogs.com/aion111/archive/2008/12/09/1350945.html
總結
以上是生活随笔為你收集整理的自我理解:const char*, char const* and char *const的全部內容,希望文章能夠幫你解決所遇到的問題。