日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自我理解:const char*, char const* and char *const

發布時間:2025/7/14 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自我理解: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種說法:

  • ?一個是指針不變,“內容”可變??? 如:char? * const cp;
  • 一個是指針可變,“內容”不變(指針所指的具體的值),如const char * p,char const * p;。
  • 以下貼出本人在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=&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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。