2010-03-31 4 views
0

Есть ли способ выяснить, где в массиве указатель?Array pointer арифметический вопрос

позволяет сказать, что мы сделали это:

int nNums[10] = {'11','51','23', ... }; // Some random sequence 
int* pInt = &nNums[4];      // Some index in the sequence. 

... 

pInt++;  // Assuming we have lost track of the index by this stage. 

... 

Есть ли способ, чтобы определить, какой элемент индекса в массиве pInt является «наведение», чтобы не ходить снова массив?

+0

К сожалению, в настоящее время сформулировано это не имеет никакого смысла для меня. – 2010-03-31 17:06:04

+0

Немного пересмотрены. – Konrad

+3

'int * pInt = nNums [4];' должно быть 'int * pInt = & nNums [4];'. –

ответ

17

Да:

ptrdiff_t index = pInt - nNums; 

Когда указатели на элементы массива вычитаются, это то же самое, вычитая индексов.

Тип ptrdiff_t определен в <stddef.h> (в C++ это должно быть std::ptrdiff_t и <cstddef> должны использоваться).

+0

Хороший ответ, спасибо. Не понял, что это было так просто :-) – Konrad

1

Если я понять Ваш вопрос (это не слишком ясно)

Тогда

int offset=pInt-nNums; 

даст вам, как далеко от начала nNums pIint. Если по

int* pInt=nNum[4]; 

вы на самом деле означает

int* pInt=nNums+4; 

затем в

int offset=pInt-nNums 

смещение будет 4, так что вы могли бы сделать

int value=nNums[offset] 

который был бы таким же, как

int value=*pInt 
1
pInt - nNums 

Кроме того,

int* pInt = nNums[4], вероятно, не то, что вы хотите. Это будет указывать на память, адрес которой будет nNums[4]

Изменить его

int* pInt = &nNums[4]; 
+3

Ум, НЕ последняя строка. Вы присваиваете значение nNums [4] неинициализированной переменной. – KTC

+0

@KTC Я установил это для него – JonH

+0

@JonH, теперь адрес nNums [4] (тип int *) присваивается указателю, который разыменован (тип int). Несоответствие типов.... – KTC