2013-03-21 60 views
0

嘿傢伙我試圖找出一些理論的指針和數組的東西。我希望有人能夠重申我對指針和數組概念的一些懷疑。指針和數組在C/C++

假設我有這樣的事情

int ia[] = {0,1,2,3,4,5}; 
ia[2]; // =2 

int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia 
ip[2]; // ?? 
ip[2] = 42; // 

大部分代碼是理論上的,但顯然我是一個有點不確定的最後2行。首先是說ip [2]與說ip現在指向數組中的第二個元素相同?相當於說* ip = ia [2]?

我也與最後一行混淆。 ip [2] = 42;所以ip指向的對象的第二個元素,該地址獲得值42?或者,這是一種解引用的數組符號方法?我只是對發生了什麼感到困惑。

+0

'ip [2];'是一個有一個值並且什麼都不做的語句。這與說'我;''3;''或'main;'是一樣的。 AKA它什麼也沒做。 – Patashu 2013-03-21 05:47:30

+0

哦對不起,我的意思是......它是如何具有價值2?如果ip最初指向ia數組中的第一個元素,那麼ip [2]的值是2 ...但邏輯上我在這裏丟失了...... – PresidentRFresh 2013-03-21 05:48:32

+1

這是一個什麼都不做的語句。這就像寫';' - 也是一句無所作爲的陳述。這相當於根本不寫文章。它做任何事情都沒有做到。 – Patashu 2013-03-21 05:49:18

回答

1

下面創建一個數組稱爲IA和陣列中存儲的數字在大括號:

int ia[] = {0,1,2,3,4,5}; 

的有效以下,什麼也不做:

ia[2]; 

但是,如果我走上面的語句和更改如下,它將值2分配給整數t。這是因爲2是ia中的第三個元素,並且ia [2]引用了ia中的第三個元素。

t = ia[2]; 

如果你原來的IA的聲明已經

int ia[] = {0,1,15,3,4,5}; 

那麼你會被分配噸至15

以下更改索引2 IA至42值:

ip[2] = 42; 

現在,ia包含{0,1,42,3,4,5}。

這是因爲ia [2]就像說*(ia + 2)。如果您將ip分配給ia,則ip指向ia的第一個元素。

同樣,ip [2]就像是說*(ip + 2)。所以,改變ip [2]將改變ia [2],它們引用相同的內存塊。

+0

感謝您的解釋 – PresidentRFresh 2013-03-21 06:35:59

1

當編寫a[i]它被轉換爲*(a+i)其中a是基地址(基本上是指針)

也用於陣列,基地址是相同第一元件的地址,以便的a[0]地址是相同a [即a = &a[0]]

所以,ip[2] = 42;轉化爲*(ip+2) = 42 此外,*在該地址ip[2] = 42給出的值是指在位置*(ip+2) = 42即價值(ip+2)

+0

ty幫忙 – PresidentRFresh 2013-03-21 06:35:31

2

ia[n]是一種不同的寫作方式*(ia+n),因此int* ip = &ia[0]int *ip = ia相同。

您正在分配iaip。這當然也使得所有n的值都爲ip[n] == ia[n]

1

a[b]*(a + b)完全相同。總是。所以​​相當於*(ia + 2)ip[2]相當於*(ip + 2)

但是,它比那更微妙,因爲iaip有非常不同的類型。 ia是數組類型;而ip是指針類型。所以他們不是「一樣的」 - 他們甚至不是同一類型的東西。這就像蘋果和橘子。

在某些上下文中使用的數組表達式可以隱式轉換爲指向其第一個元素的指針。如果你寫了,int *ip = ia;,那將是這樣一個隱式轉換 - ip現在指向ia的第一個元素。這是完全一樣的,你寫的東西,int *ip = &ia[0];

當你喜歡寫東西*(ia + 2),再次,在此背景下,陣列也隱式轉換爲一個指向它的第一個元素,有點像*(&ia[0] + 2)。由於我們知道ip指向ia的第一個元素,因此在任何將其轉換爲指針的上下文中使用ia時,它與使用ip的值相同。這就是爲什麼​​和ip[2]工作原理相同。