關於c語言指標的兩處小tip分享

來源:互聯網
上載者:User

1:常量指標與指標常量

常量指標與指標常量名字很接近,但是兩者區別很大。
常量指標是指指向常量的指標,例如:char const *st[4]="str";或者使用下面的方法,效果是一樣的:const char *st[4]="str"; 它聲明了一個指標變數,這個指標指向了一個常量字串,但是由於指向的記憶體空間是常量,因此該地址的內容是不能修改的,例如:*st="no"; //這是不行的,因為記憶體空間的內容不能修改st="ok"; //這是可以的,雖然指向的記憶體內容不能修改,但是指標的指向是可以修改的。
指標常量是指一個指向固定記憶體單元的指標,其內容可以修改,但是不能改變指向的位置,例如:char *const st[4]="str";*st="ok"; //這是可以的,因為指向位置的內容可以修改。st="no"; //這樣行不通,因為指標是不能改變指向位置,即如果初始化為地址0X8000,那麼它只能指向這個位置,不能改變,但是0X8000的內容是可以改變的。

char *s = "abcde";
s[0] = '1';//此句在運行時出錯

如下是可以的:

char s[] = "abcde";
s[0] = '1';

  
因為:

字串常量是不能改的,編譯後是放到唯讀記憶體(靜態儲存區)中的;

char[]和char*在很多地方可以通用,但是有個微妙的關係,那就是頭指標相同;

因為“通過指標修改字串常量的行為”是未定義的,上次就有個人問"為什麼上述代碼在TC下不報錯而在VC6.0下報錯"。不過,現在大多實現把常量字串的儲存空間設定為read-only,所以運行時報錯;

char *s = "abcde";相當於const char *s = "abcde";

-------------------------------------------
按照樓上各位的說法,編譯器應該禁止這麼聲明:
char *s = "abcde";
而強制我們如下聲明:
const char *s = "abcde";
為什麼編譯器沒有這麼做呢?
--------------------------------------------
沒錯,的確因該像樓主說的那樣,編譯器應該禁止這種行為,進而協助程式員寫出正確的程式。
但是,這是一個特殊情況,是一個特例!
為什麼這麼說呢?因為char *s = "abcde";這種模式已經被很多人所使用(也包括樓主),它被使用的如此廣泛以至於標準給它一些寬容:允許這樣的代碼通過編譯。

-------------------------------------------- 《effective c++》91頁注釋1:
在C++ standard中,"Hello"的型別是const char[];這個型別幾乎總是被視為const char*。因此我們預期,以一個字串子面常量(string literal,例如"hello")作為一個char*變數的初值,會違反常量性。但是此種行為在C語言中實在太過頻繁,所以C++ standard對於這樣的初始化動作特別給與豁免。儘管如此,你還是應該避免這麼做,因為那畢竟不被大家認同。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.