如何來理解c語言的這個陷阱

2021-06-20 16:40:06 字數 906 閱讀 1673

首先還請先看完前一篇「如何理解const char*, char const*, char*const等」

c語言的乙個經典的陷阱:

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

1.typedef

char* pstr;  

2.charstring[4] = "abc";  

3.const

char*p1 = string;  

4.constpstr p2 = string;  

5.     p1++;  

6.    p2++;

答案是第6句,p2不能改變。可p1,p2不是一樣嗎,怎麼就不能改變值了呢?

pstr被當成整體後,返回的是p2,const描述的是p2不能變。所以第6句錯了。

到這裡,我想到乙個問題,按解釋*p1是const,可沒說*(p1+1)是const。它已不是前面說的記憶體2,而是記憶體2後面的那塊記憶體。沒說他是const啊,能被賦值嗎?如*(p1+1)=」d」;

首先重申一下,這裡的const並不是說那塊記憶體不能修改,而是通過這種方式不能修改那塊記憶體,忘了的話,再去看看前一篇。描述有問題的,自行改正(^-^)。

事實證明*(p1+1)=」d」是不行的,為什麼呢?官方的說法我不知道。奇淫技巧可以這麼來解釋:

首先你要對乙個東西賦值,你總得先知道這是什麼東西吧。好看看左邊「*(p1+1)」,這是什麼東西?

「(p1+1)」:整個相當於p,也就是記憶體1,他是由p1衍生出來的兄弟變數,新的變數copy了兄弟的特點,相當於(p1+1)也被const char *修飾過了一般,其用法跟p1一模一樣,所以不能通過這種方式來修改那塊記憶體。

寫得不好,歡迎拍磚。

C語言的小陷阱

踩坑時間 2019 5 13 2019 5 17 char str header null str body null 正確的應該是 char str header null str body null 這個錯誤讓我遭受了乙個執行時錯誤,給str body分配一段堆記憶體,平安無事,再向記憶體中拷貝...

C語言中的技術陷阱

c語言深入學習階段,我正在讀 c語言程式設計之道 這本書,整理了c語言中的一些技術陷阱。這本書上的封面上有一句話我覺得挺有道理 每多學一點知識,就少寫一行 知識便是財富。一 c語言中的識別符號是區分大小寫的 這是很基本的問題,初學者也很容易忽視。二 與 的混淆使用 例如 int main 本想定義二...

C 語言中 struct 的陷阱

假設我們要為某大學寫乙個工資管理程式。首先是表示員工的 employee 類 employee.cs 01 namespace skyiv.ben 02 06 public string name 07 public decimal salary 08 09 public employee stri...