2010-03-31 3 views
0

Existe-t-il un moyen de déterminer où se trouve un pointeur dans un tableau?Question arithmétique de pointeur de tableau

Disons que nous avons fait:

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. 

... 

est-il un moyen de déterminer quel indice élément du tableau pInt est « pointage » pour sans marcher à nouveau le tableau?

+0

Désolé, comme actuellement formulé cela fait aucun sens pour moi. –

+0

Reformulé légèrement. – Konrad

+3

'int * pInt = nNums [4];' doit être 'int * pInt = & nNums [4];'. –

Répondre

17

Oui:

ptrdiff_t index = pInt - nNums; 

Lorsque des pointeurs vers des éléments d'un tableau sont soustraites, il est le même que la soustraction des indices.

Le type ptrdiff_t est défini dans <stddef.h> (en C++ il doit être std::ptrdiff_t et <cstddef> doit être utilisé).

+0

Bonne réponse, merci. Je n'ai pas réalisé que c'était si simple :-) – Konrad

1

Oui. Vous prenez la valeur de:

pInt - nNums 
1
ptrdiff_t delta = pInt - nNums; 
1

Si je comprends bien votre question (il est pas trop clair)

Puis

int offset=pInt-nNums; 

vous donnera la distance depuis le début de nNums pIint est. Si par

int* pInt=nNum[4]; 

vous avez vraiment voulu dire

int* pInt=nNums+4; 

puis dans

int offset=pInt-nNums 

décalage sera 4, pour que vous puissiez faire

int value=nNums[offset] 

qui serait le même que

int value=*pInt 
1
pInt - nNums 

En outre,

int* pInt = nNums[4] est probablement pas ce que vous voulez. Il pointera vers la mémoire, l'adresse qui serait nNums[4]

Modifier à

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

Um, pas la dernière ligne. Vous affectez la valeur dans nNums [4] à une variable non initialisée. – KTC

+0

@KTC J'ai corrigé le fait que pour lui – JonH

+0

@JonH, maintenant l'adresse de nNums [4] (type int *) est assignée à un pointeur qui est déréférencé (type int). Incompatibilité de type.... – KTC