C 指標找茬

2021-06-01 09:33:13 字數 1194 閱讀 6817

1.下面的**中編譯器會報乙個錯誤,你知道是哪個語句錯了嗎?

typedef char * pstr;

char string[4] = "abc";

const char *p1 = string;

const pstr p2 = string;

p1++;

p2++;

是p2++出錯了。這個問題再一次提醒我們:typedef和#define不同,它不是簡單的文字替換。上述**中const pstr p2並不等於const char * p2。const pstr p2和

const long x本質上沒有區別,都是對變數進行唯讀限制,只不過此處變數p2的資料型別是我們自己定義的而不是系統固有型別而已。因此,const pstr p2的含義是:限定數

據型別為char *的變數p2為唯讀,因此p2++錯誤。

解釋:const char *p1 = string; 你可以這樣理解:(const char) *p1 = string, p1是乙個指標,指向const char的東西,這個東西就是string(string是乙個字元陣列的首位址,它的位址宣告後肯定是const的,除非該陣列銷毀),但是p1是乙個 指標變數,它是可以遞增的,即你看到的p1++,它可以完成從陣列的來遍歷陣列的目的。

而const pstr p2 = string;是這樣的:由於p2不是指標,const直接修飾到了p2,即現在的p2是常量了(所以p2++就出錯了,因為常量不能改),它的型別是pstr(我們自己定義的型別),相當於 const int p2, const long p2等等,const都是直接修飾p2的,只不過int,long是系統型別,而pstr是我們定義的型別。為什麼會出現這種效果了,就是因為 typedef,它把char *定義成乙個復合的型別,要從整體上來理解語義,而不是字元替換後來理解語義。

2011-10-21 16:24 by 

尋找一片天空

"string是乙個字元陣列的首位址,它的位址宣告後肯定是const的,除非該陣列銷毀"

該語句感覺有誤.....

什麼叫"它的位址宣告後肯定是const的",完全可以如下定義:

char string[4] = "abc";

char *p1 = string;

2011-10-21 21:30 by 

mooner++

2011-10-21 23:18 by 

尋找一片天空

Pubwin 2007有獎「找茬」計畫

pubwin 2007在研發過程中吸取了廣大網管的建議,軟體質量有了很大的提高,為長期保證pubwin 2007的品質,新浩藝公司現推出pubwin 2007有獎 找茬 計畫,即從2007年6月14日發布的pubwin2007 版本起 只包括正式發布的版本,不包括測試版本 任何人只要找出乙個問題,新...

CTO札記 找茬 功能分析

終於發現了乙個 找茬 功能的sample 譯言,二 直接啟示 開發同樣功能 類似 配合上一定的使用者激勵,活躍度會蠻高的。2 它是少有的同時關聯3個主體物件的功能。相較於讀者與書互動 如收藏 投票 讀者與讀者之間互動 如加好友 論壇 等一物件 二物件關聯功能,找茬 增加了作者這一互動元素。而作者是文...

CTO札記 找茬 功能分析

終於發現了乙個 找茬 功能的sample 譯言,二 直接啟示 開發同樣功能 類似 配合上一定的使用者激勵,活躍度會蠻高的。2 它是少有的同時關聯3個主體物件的功能。相較於讀者與書互動 如收藏 投票 讀者與讀者之間互動 如加好友 論壇 等一物件 二物件關聯功能,找茬 增加了作者這一互動元素。而作者是文...