2016-06-01 41 views
3

有人問我這個問題,作爲課堂練習:printf和陣列

int A[] = {1,3,5,7,9,0,2,4,6}; 

printf("%d\n", *(A+A[1]-*A)); 

我想不出它在紙上,所以徑自編譯一個簡單的程序和測試,並發現printf("%d",*A)總是給輸出爲1

但我仍不明白爲什麼會出現這種情況,因此如果有人能解釋這一點,那將是非常好的。

+0

@abelenky:結果'1'是從'的printf( 「%d \ n」,* A)',它是我相信你會期待什麼。不過,原來的代碼會產生'5'。問題是誤導。 –

+1

@abelenky:Steve0101是正確的,printf(「%d \ n」,* A)將始終爲給定數組打印1。 – babon

+0

是的,我誤解了它,並認爲他得到了更大表達式的輸出1。抱歉。仍然,鏈接到IDEOne,作爲一種分享[MVCE代碼](http://ideone.com/4fu3Sj) – abelenky

回答

0

C中的數組變量只是指向數組的初始內存位置的指針。所以如果你引用數組,你總是會得到第一個位置的值。

如果您總結1到原始數組值,如*(A+1)您將獲得第二個位置。

你可以使用相同的方法從所述陣列的任何位置:

*(A)是第一位置

*(A+1)是第二位置

*(A+2)在第三位置

等在...

如果你聲明int arr如int* A並分配內存並賦予這些值的屬性,通常可以更容易地看到它的工作原理。

+1

的好方法,數組自動轉換爲用於解引用的指針,但是*數組不是指針!* – MikeCAT

7

A是一樣處理指向整數數組的第一個元素的指針。 A [1]是該數組的第一個元素的值,它是3(索引是從0開始的) * A是A指向的值,如果數組的第零元素,則爲1. So

A[1] - *A == 3 - 1 == 2 

現在我們有

*(A + 2) 

這就是指針運算踢英寸由於A是一個指向整數,a + 2點到第二(從0開始)項數組和在* (A + 2)獲得它的價值。 所以答案是5.

另請注意,爲了將來的參考指向整數和整數數組的指針在C中有些不同的東西,但爲了討論的目的,它們是相同的東西。

+0

儘管它是自動的轉換爲這個表達式中的一個指針,'A'是一個*數組*,而不是一個指針。 – MikeCAT

+0

@MikeCAT是的,像往常一樣,說謊是非常誘人的,並說數組是指針。他們幾乎是(爲了這種情況)。 –

+0

「第一個元素的值」..不,第二個。 –

4

把它分解成其組成部分:

A由本身是陣列,這也相當於&A[0],所述陣列的所述第一元件的所述存儲器地址的存儲器地址。

A[1]是存儲在所述陣列的所述第二元件,其爲3。

*A解引用數組,這是equivilent到A[0]的存儲器地址的值,存儲在所述陣列的所述第一元素的值,這是1。

所以,做一些換人:

*(A+A[1]-*A) 
= *(A+(A[1])-(A[0])) 
= *(A+3-1) 
= *(A+2) 

的符號*(Array+index)相同的符號Array[index]。在引擎蓋下,它們都取數組的起始地址,將數組元素類型的字節數(在這種情況下爲int)乘以索引,然後取消引用結果地址。所以*(A+2)相同A[2],其是5

2
  • 在表達式中使用的陣列被自動轉換成在除了一些例外陣列的第一元件指向指針如sizeof操作數或一元&運算符。
  • E1[E2]被定義爲等同於用於指針將指針向前和向後移動*((E1) + (E2))
  • +-操作者。

在這種情況下,*A相當於*(A + 0),這相當於A[0]和它會給你數組的第一個元素。

表達*(A+A[1]-*A)

  1. 得到的指針的第一個元素,它指向在1,經由A
  2. 提前將指針移動到A[1](3)的元件經由+A[1],所以現在的指針指向at 7
  3. 將指針移動到*A(1)元素之前,通過-*A指向,因此指針現在指向5
  4. 解除引用經由一元*操作者的指針,所以表達式被評估以5
+0

我知道你在想什麼,但是我猜混淆的是*移動指針..「*短語。由於*運算符的優先級,在'A(1)'('+ 3')和' - * A'('-1')被添加到指針「A '在被解除引用之前。所以指針不會移動,您在解除引用之前有效地添加了'2'。或者,是否有另一個指針正在移動? –

+0

@ DavidC.Rankin「指針」在這裏是一個右值,「移動指針」的意思是「讓指針指向不同的位置」 –

+0

是的,這就是我所理解的那樣,但是這個措詞仍然導致了雙重的錯誤。然後tripple拿起,並有點頭部劃傷,試圖找出意思。就像之前的評論一樣,很顯然,邁克在理解上沒有問題,但措辭似乎與他發佈的良好解決方案不一致。 –