2010-11-25 2 views
2

Я знаю, что foo[bar] равен *(foo + bar), но что такое *foo[bar], равный, например, для доступа к *argv[2]? Я несколько смущен в понимании этого, я предположил, может быть, что-то вроде *(*(foo) + bar), но я не уверен.Арифметика указателя на указатель указателя (* argv [])?

Прошу прощения, если это простой ответ.

+1

Вы можете просто попробовать. В случае сомнений используйте круглые скобки. – codymanix 2010-11-25 17:32:26

ответ

2

Это мое понимание того, что это **(foo + bar)

Почему ?

*foo[bar] ломается до * и foo[bar] т.к. * делается после foo[bar] разыменовывается.

Вы уже ответили, что foo[bar] == *(foo + bar)

Теперь добавьте еще * и у вас есть *(*(foo + bar))

Что также упрощает для **(foo + bar)

5

*a[b] эквивалентен *(a[b]) из-за правил приоритета C и C++. так *a[b] эквивалентно **(a+b)

+0

Ах! это намного проще понять. Я знал, что это просто, просто нужно подождать 11 минут, чтобы принять: P – John 2010-11-25 17:33:04

3

Если эквивалентны следующие,

foo[bar] 
*(foo + bar) 

Тогда эквивалентны следующие тоже:

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

Спасибо, Джеймс. – John 2010-11-25 17:34:27

0

*foo[bar] является указателем на разыменовать foo[bar].

0

Предполагая декларацию char *argv[], argv[2] относится к третьему элементу argv массива, который является char * и *argv[2] разыменовывает этот указатель, что дает вам первый символ в этой строке.

Смежные вопросы