指標、指標變數與記憶體空間——解惑
一年前,我曾今在chinaunix寫過一篇部落格《關於定義乙個指標與指標變數》然後搬家來了csdn。這篇部落格中寫道了很多關於指標和指標變數以及空間分配的一些常見錯誤。但是,到現在為止,無論是csdn的網友還是一些已經工作的同事以及大三大四的學生,陸陸續續的有人在問我關於指標與指標變數還有空間分配問題。我想在這裡再寫一篇部落格解惑指標
問題1
既然通常*p表示對指標p指向資料的引用,為什麼*p = idata不能行呢?
回答:int *p和引用時的*p概念是不一樣的。定義資料的時候 int *p所表示的是定義了乙個指向int資料的指標p。並不是資料引用時的*p.
所以,int *p只是定義了乙個指向int資料的指標p,這個指標p所存放的是乙個位址(32位),而idata是乙個int資料,int資料不能賦值給乙個位址。除了定義以外的其他地方,*p所表示就是p所指向的資料。
所以以上語句作出以下更改就對了:
問題2:
既然問題1中已經說了,定義是只是定義了乙個指標p,下面的語句為什麼是對的呢?
回答:c語言中,字元字串常量是按字串陣列來處理的,會在記憶體中開闢乙個字串陣列用來存放該字串常量,然後把該字串數字的首元素位址賦值給p。
以上語句其實等價於下面:
問題3:
對於結構體指標,struct mystruct *pstruct,然後對pstruct進行操作,為什麼有時候正確,有時候又報記憶體錯誤?
回答:指標的操作分為輸入與輸出。所謂輸入:即將指向結構體的指標pstruct穿進去給別人處理。輸出:即別的函式需要輸出,需要寫的。
你所謂的有時候正確有時候又不正確,其實是因為你沒有搞清楚究竟該誰分配空間。一定要銘記:定義乙個指標只是定義了乙個存放位址的指標變數,他只能存放位址,定義乙個指標並沒有為他所指向的資料分配空間。例如 struct mystruct *p,定義了乙個指向struct mystruct的指標變數p,並沒有分配struct mystruct大小的資料空間。如果p沒有指向任何資料,你對它進行寫操作,必定會出記憶體錯誤。
但是如果這樣做:
struct mystruct myst;
struct mystruct *p = &myst;
然後再對p進行操作,就不會出錯。說到底,還是沒有弄清楚程式設計需要誰去為資料分配空間的問題。
最近在溫故《c ++ primer》這本書,其中有一句話非常經典:
when attempting to understand pointer declarations, read them
from right to left.
理解指標定義的時候,應該從右往左讀
關於指標a與 a所代表的記憶體空間
遇見一道題 int a 3 int p int a 1 printf d,d a 1 p 1 以為 p 1應該輸出為1,但跑過程式才發現輸出為3 然後就debug了一下,經過若干除錯,發現規律如下 a作為陣列的指標,其值為該陣列記憶體的起始位址,而在debug中,a的值與a相同。但若對a與 a進行加...
記憶體空間與分配
1 記憶體分配錯誤 動態記憶體分配錯誤有兩種基本型別 記憶體錯誤和記憶體洩漏。1 記憶體錯誤 當乙個指標或者該指標所指向的記憶體單元成為無效單元,或者記憶體中分配的資料結構被破壞時,就會造成記憶體錯誤。指標未被初始化,指標被初始化為乙個無效位址,指標被不小心錯誤地修改,在與指標相關聯的記憶體區域被釋...
初始化指標是否需要分配記憶體空間
初學指標,不知道聲名指標或者聲名物件時為什麼要用new來分配記憶體空間,如以下 int a int b 2 a b cout a a 此處輸出結果為 a 2 而再看如下 int a int b 2 a b cout a a 執行時編譯器會報錯,為什麼呢?簡單來講,我們沒有為int 型指標p開闢記憶體...