2010-11-25 5 views
2

Je sais que foo[bar] est égal à *(foo + bar), mais qu'est-ce que *foo[bar] égal à, par exemple accéder à *argv[2]? Je suis quelque peu confus dans la compréhension de cela, j'ai supposé peut-être quelque chose comme *(*(foo) + bar) mais je ne suis pas sûr ..Arithmétique du pointeur sur le pointeur du pointeur (* argv [])?

Je m'excuse si c'est une réponse simple. Est

+1

Vous pouvez simplement l'essayer. En cas de doute, utilisez des parenthèses. – codymanix

Répondre

2

Je crois savoir qu'il est **(foo + bar)

Pourquoi ?

*foo[bar] se décompose en * et foo[bar] puisque * est effectué après foo[bar] est déréférencé.

Vous avez déjà répondu à ce foo[bar] == *(foo + bar)

Maintenant, ajoutez un autre * et vous avez *(*(foo + bar))

ce qui simplifie également **(foo + bar)

5

*a[b] est équivalent à *(a[b]) en raison de règles de priorité C et C++. si *a[b] est équivalent à **(a+b)

+0

Ah! c'est beaucoup plus simple à comprendre. Je savais que c'était simple, juste besoin d'attendre 11 minutes pour accepter: P – John

3

si les conditions suivantes sont équivalentes,

foo[bar] 
*(foo + bar) 

Ensuite, les éléments suivants sont équivalents aussi:

*foo[bar] 
**(foo + bar) 
+0

Merci James. – John

+0

Est-ce que je comprends bien que votre partie if est destinée à faire face au fait que * et [] peuvent être surchargés? –

+0

@Armen Tsirunyan: Je pense que le "Si ... alors" ne fait que démontrer le processus de déduction logique qui peut être suivi pour trouver le résultat. – caf

0

*foo[bar] est le pointeur déréférencer à foo[bar].

0

En supposant une déclaration de char *argv[], argv[2] fait référence au troisième élément du tableau argv, qui est un char * et *argv[2] déréférence ce pointeur, vous donnant le premier caractère dans cette chaîne.