對C語言中指標初始化的更深一步的認識

2022-04-09 17:58:30 字數 1330 閱讀 5094

說來慚愧,前幾天程式設計序,犯了乙個比較低階的錯誤,結果導致折騰了一上午來解決這個問題,最後發現,問題主要是出在對於指標的初始化認識的不夠深刻,遂現在記錄之,以便於時刻提醒自己。

指標在c語言程式設計中的重要性在這裡自不必多說,單單有一本非常經典的c語言程式設計書籍叫《c和指標》便可體現出來。指標看似簡單,但是卻常常是整個程式走不通的主要原因。所以,認識指標一定不能只是單單的停留在表面的概念和定義上,知道指標變數所儲存的值是所指向的位址值,知道間接訪問,這些是遠遠不夠的,應該能夠透過指標華麗的外衣,裸視指標!

而在指標中,我個人認為最難理解的實際上是指標的定義和初始化,為什麼這麼說?直接上例子。

就以這兩句初始化為例,有多少人看到這樣的初始化會直接說,這不就是初始化乙個指標*p,這個指標指向的是乙個型別為整型的值。不錯,這確實是沒錯,但是更準確的說法應該是,1、其實指標變數指的是p這個變數,指標變數指的就是p,而不是*p;2、而int指出的是這個指標所指向的值的型別;3、而*只是表明這個p變數是乙個指標變數。看到乙個指標變數的定義,一定不能只是單純的從普通變數定義的角度來看待,如int p,這是個普通變數的定義,看到這個定義,可以直接將其分成兩部分來看,1、定義了乙個變數p;2、這個變數p是乙個整型變數。但是指標變數的定義,如果只是這樣單純的從兩部分來看,就大錯特錯了。再拿第二個定義為例,乍一看上去,感覺嚇一跳,但實際上按照上面說的對於指標的三部分看的方法,就非常明顯了,1、首先定義的是乙個指標變數pp,這裡注意,這裡確實是定義了乙個指標變數,這個指標變數就是pp,不是*pp,也不是**pp,這裡很多人會搞混,;2、**指出,這裡定義的是乙個指向指標的指標,即這個變數pp指向的是乙個指標,再更加深入的解釋,就是pp中儲存的值是乙個指標變數所在的位址,對pp進行間接訪問實際上得到的是乙個指標所在記憶體空間中儲存的值,而這個指標所占用的記憶體空間中所儲存的值仍然是乙個位址值,這裡記為addr1;3、int則指出的是addr1這個位址空間中儲存的值為int型的。這裡如圖:

介紹完指標變數的定義之後,接下來說說指標變數的初始化問題,這個問題我想對於初學者來說是非常容易迷糊的問題,即使是非初學者,但是對指標的認識不到位的話,也容易在這上面栽跟頭。首先按照慣例,看看例子。

看到這樣的初始化,想問乙個問題,將0賦給了誰?是*p or p?

如果對上面介紹的指標變數的定義的實質有了深刻的理解之後,其實這個問題很簡單,不錯,0被賦給了指標變數p,也就是說指標變數p所占用的記憶體空間中現在儲存的值是0,換句話說,指標p現在指向的是位址為0x00000000的記憶體空間。這個概念一定要搞清楚,不能單純的以為0是p這個指標所指向的值!

這裡面的具體的分析過程參看博文對指標進行初始化中的若干問題的思考與反思

C語言中的初始化問題

經常在c語言工程中,尤其是比較大的程式,執行過程中會出現由於記憶體或堆疊導致的各種問題,輸出錯誤或執行崩潰 1.字串陣列的初始化 1 char str 10 2 char str 10 3 char str 10 str 0 0 2.字元陣列的初始化 int a 5 錯誤 int a 5 只有第乙個...

對C語言中指標的入門理解

當指標p的值為物件x的位址時,我們一般會說 p指向x 接著進行 xiaohong xiaoli 的複製,我們就可以得出 小紅喜歡小李 xiaolin xiaohong的資料型別是 指向int型變數的指標型 xiaolin xiaozhang xiaohong xiaowang 從以上賦值語句也可以發...

C語言中結構體的初始化

大全 建議在變數定義的時候進行初始化,但是很多人,特別是新人對結構體或者結構體陣列定義是一般不會初始化,或者不知道怎麼初始化。1 初始化 typedef struct test t test t test t gst 可以初始化,設定i為1,s為乙個字串.test t gst 初始化個數少於實際個數...