2016-10-22 3 views
0

Если у меня есть следующий двойной указатель, и я использую его в форме массива, какая из указанных форм указателя эквивалентна?Условная эквивалентность нотации массива двойного указателя

char** argv = malloc(2*sizeof(char*)); 

//argv[0] == (argv + 0), *(argv + 0), or (*argv + 0)? 

//Same way, what would argv[0][0] be equivalent to in terms of *(*(argv +i)+j), etc.? 
+0

Ваш второй комментарий является правильным и содержит ответ на первый. Предполагая, конечно, что ваш код имеет дополнительные вызовы 'malloc' для инициализации двух указателей, которые вы выделили первым вызовом' malloc'. – user3386109

+0

Не могли бы вы помочь мне понять, почему мне нужно дважды malloc? Итак, если я malloc для char ** argv, этого недостаточно для char * argv? Мне также нужно malloc для char * argv? –

+0

'argv + 0' эквивалентно' argv' (очевидно). '* argv + 0' эквивалентно' * argv' (также obviosly). 'argv' не эквивалентен' * argv' (очень очевидно). –

ответ

0

//argv[0] == (argv + 0), *(argv + 0), or (*argv + 0)?

Ну вот как *(argv + 0) и (*argv + 0) оба эквивалентны argv[0]. Это можно легко узнать, распечатав вывод. Вы можете сделать что-то вроде этого:

char** argv = malloc(2*sizeof(char*)); 

for(int i = 0; i < 2; i++){ 
    argv[i] = malloc(1); 
} 

//printing the values: 
printf("%p == %p\n", argv[0], argv + 0); 
printf("%p == %p\n", argv[0], *(argv + 0)); 
printf("%p == %p\n", argv[0], *argv + 0); 

выход:

0x8e84018 == 0x8e84008 //not equal 
0x8e84018 == 0x8e84018 //same 
0x8e84018 == 0x8e84018 //same 

смотрите здесь полный пример: https://ideone.com/DDXuI9

это не верно в случае (argv + 0) потому, что (argv + 0) указывает на адрес самого char** argv, тогда как argv[0] указывает на адрес первого элемента (который относится к типу char*)