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

2022-10-04 05:15:08 字數 1584 閱讀 7849

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";

--------------------------xttnl-----------------

按照樓上各位的說法,編譯器應該禁止這麼宣告:

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對於這樣的初始化動作特別給與豁免。儘管如此,你還是應該避免這麼做,因為那畢竟不被大家認同。

本文標題: 關於c語言指標的兩處小tip分享

本文位址: /ruanjian/c/94966.html

C語言 關於函式指標的幾個小測試

include void func void intmain func是函式名,p func是指向該函式的指標,那麼有 func 004015c0 func 004015c0 func 004015c0 p func 004015c0 p func 004015c0 p func 0061fecc可...

關於C語言的指標

一級指標 指標是什麼?在電腦科學中,指標 pointer 是程式語言中的乙個物件,利用位址,它的值直接指向 points to 存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為 指標 意思是通過它能找到以它為位址的記憶體單元 指標...

關於C語言的指標

c語言指標 今天學習了指標,講講我對它的認識。這是乙個指標 int i int p scanf d i p i i是乙個整型變數,p是乙個指標,輸入時賦值給i,p是i的位址。就好比,i是房子的名字,p是房子的位址,輸入的值是放在房子裡的東西。符號 是取位址的意思,在這裡是對i取位址。定義指標的時候,...