2010-06-30 51 views
1

爲什麼不這項工作:C++:新,瞭解內存問題

片段1:

 
int *a = new int[6]; 
(*a)[0]=1; 

,而這是工作

片段2:

 
int myint = 0; 
int *ptr = &myint; 
*ptr=1; 

我知道如果我在代碼片段1中使用a[0]=1,它將起作用。但對於我來說沒有任何意義,對我來說,看起來a[0]=1意味着:將值1設置爲應答[0]。換句話說,我把價值作爲記憶。相反,使用(*a)[0]=1這對我意味着更有意義:將值1置於a [0]指向的值字段。

任何人都可以描述這種差異?

+0

它可能對你更有意義。但是隨着其他開發者社區每次讀取代碼時都會感到困惑,這可能不是一個好主意。習慣該語言使用的約定,並改變您的行爲以匹配。 – 2010-06-30 21:36:34

回答

1

你應該只使用* a not(* a)[0]。

記住'a'是一個指針。指針是一個地址。

*a = a[0] or the first integer 
*(a + 1) = a[1] or the second integer 

'a'不是指向數組的指針。它是一個指向整數的指針。因此,* a不會將數組交給您,以便[]在其上進行操作。

令人困惑的是,整數數組的地址也是該數組中第一個整數的地址。記住要始終記住你在左側分配的類型。

考慮以下幾點:

int x = 10; 

該片段聲明一個整數x和分配給它的值10。現在考慮這樣的:

int *y = &x; 

該片段聲明Y是指針的整數並將x的地址分配給y。

你可以寫這樣說:

int x = 10; 
int *y; 

y = &x; 

順便說一句,當你將東西「Y」上面會簡單地把數據在該地址,並把它變成一個整數。因此,如果您將它發送到char數組(每個8位或1個字節),並且整數是32位(4個字節),那麼它將只讀取char數組的前四個字符,並將其轉換爲產生32位數字爲一個整數。

用指針仔細踩踏,這裏有龍。

11

片段1應該是:

int *a = new int[6]; 
a[0]=1; 

這是因爲a[0]相當於*(a+0)

1

這是含糊不清如果指針指向一個數組或單個項目。

(*a)取消引用第一個(或可能只有)項目。

a[0]解除引用第一項。

a[1]將指針顯式視爲一個數組,並將第二個項目解引用。程序員應確保存在這樣的項目。

1

索引操作符[]有一個內置的*操作符。因此,第一個片段,基本上是做這樣的:

int *a = new int[6]; 
*((*a) + 0) = 1; 

所以,解引用一次,它下降到int,然後加零(指數),然後嘗試再次取消引用。