關(guān)于c語(yǔ)言指針的兩處小tip分享
1:常量指針與指針常量
常量指針與指針常量名字很接近,但是兩者區(qū)別很大。
常量指針是指指向常量的指針,例如:char const *st[4]="str";或者使用下面的方法,效果是一樣的:const char *st[4]="str"; 它聲明了一個(gè)指針變量,這個(gè)指針指向了一個(gè)常量字符串,但是由于指向的內(nèi)存空間是常量,因此該地址的內(nèi)容是不能修改的,例如:*st="no"; //這是不行的,因?yàn)閮?nèi)存空間的內(nèi)容不能修改st="ok"; //這是可以的,雖然指向的內(nèi)存內(nèi)容不能修改,但是指針的指向是可以修改的。
指針常量是指一個(gè)指向固定內(nèi)存單元的指針,其內(nèi)容可以修改,但是不能改變指向的位置,例如:char *const st[4]="str";*st="ok"; //這是可以的,因?yàn)橹赶蛭恢玫膬?nèi)容可以修改。st="no"; //這樣行不通,因?yàn)橹羔樖遣荒芨淖冎赶蛭恢?,即如果初始化為地?X8000,那么它只能指向這個(gè)位置,不能改變,但是0X8000的內(nèi)容是可以改變的。
char *s = "abcde";
s[0] = '1';//此句在運(yùn)行時(shí)出錯(cuò)
如下是可以的:
char s[] = "abcde";
s[0] = '1';
因?yàn)椋?/STRONG>
字符串常量是不能改的,編譯后是放到只讀內(nèi)存(靜態(tài)存儲(chǔ)區(qū))中的;
char[]和char*在很多地方可以通用,但是有個(gè)微妙的關(guān)系,那就是頭指針相同;
因?yàn)椤巴ㄟ^(guò)指針修改字符串常量的行為”是未定義的,上次就有個(gè)人問(wèn)"為什么上述代碼在TC下不報(bào)錯(cuò)而在VC6.0下報(bào)錯(cuò)"。不過(guò),現(xiàn)在大多實(shí)現(xiàn)把常量字符串的存儲(chǔ)空間設(shè)置為read-only,所以運(yùn)行時(shí)報(bào)錯(cuò);
char *s = "abcde";相當(dāng)于const char *s = "abcde";
-------------------------------------------
按照樓上各位的說(shuō)法,編譯器應(yīng)該禁止這么聲明:
char *s = "abcde";
而強(qiáng)制我們?nèi)缦侣暶鳎?BR>const char *s = "abcde";
為什么編譯器沒(méi)有這么做呢?
--------------------------------------------
沒(méi)錯(cuò),的確因該像樓主說(shuō)的那樣,編譯器應(yīng)該禁止這種行為,進(jìn)而幫助程序員寫(xiě)出正確的程序。
但是,這是一個(gè)特殊情況,是一個(gè)特例!
為什么這么說(shuō)呢?因?yàn)閏har *s = "abcde";這種模式已經(jīng)被很多人所使用(也包括樓主),它被使用的如此廣泛以至于標(biāo)準(zhǔn)給它一些寬容:允許這樣的代碼通過(guò)編譯。
-------------------------------------------- 《effective c++》91頁(yè)注釋1:
在C++ standard中,"Hello"的型別是const char[];這個(gè)型別幾乎總是被視為const char*。因此我們預(yù)期,以一個(gè)字符串子面常量(string literal,例如"hello")作為一個(gè)char*變量的初值,會(huì)違反常量性。但是此種行為在C語(yǔ)言中實(shí)在太過(guò)頻繁,所以C++ standard對(duì)于這樣的初始化動(dòng)作特別給與豁免。盡管如此,你還是應(yīng)該避免這么做,因?yàn)槟钱吘共槐淮蠹艺J(rèn)同。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(122.買(mǎi)股票的最佳時(shí)間之二)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(122.買(mǎi)股票的最佳時(shí)間之二),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07
基于MFC實(shí)現(xiàn)類(lèi)的序列化詳解
序列化是將程序中的對(duì)象以一種二進(jìn)制格式存儲(chǔ)到存儲(chǔ)設(shè)備中(例如文本/數(shù)據(jù)庫(kù)等),以實(shí)現(xiàn)“永生”或隨意“流動(dòng)”。本文將為大家詳細(xì)講講如何基于MFC實(shí)現(xiàn)類(lèi)的序列化,需要的可以參考一下2022-07-07
C語(yǔ)言實(shí)現(xiàn)餐飲結(jié)賬管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐飲結(jié)賬管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11
C++類(lèi)結(jié)構(gòu)體與json相互轉(zhuǎn)換
這篇文章主要介紹的是C++類(lèi)結(jié)構(gòu)體與json相互轉(zhuǎn)換,json字符串一般使用的是開(kāi)源的類(lèi)庫(kù)Newtonsoft.Json,方法十分簡(jiǎn)潔,下面就隨小編一起看下面文章內(nèi)容吧2021-09-09
QT Creator+OpenCV實(shí)現(xiàn)圖像灰度化的示例代碼
這篇文章主要為大家詳細(xì)介紹了QT如何利用Creator和OpenCV實(shí)現(xiàn)圖像灰度化效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下2022-12-12
C++中typedef 及其與struct的結(jié)合使用
這篇文章主要介紹了C++中typedef 及其與struct的結(jié)合使用,需要的朋友可以參考下2014-02-02

