2017-02-08 2 views
0

У меня есть фрагмент кода, который я не могу понять, как он работает, из-за одной строки, которая выполняет двойное разыменование. Код выглядит следующим образом:Вызов двойного указателя

void afunction(int**x){ 
    *x = malloc(2 * sizeof(int)); 
    **x = 12; 
    *(*x + 1) = 13; 
} 

int main(){ 
    int *v = 10; 
    afunction(&v); 

    printf("%d %d\n", v[0], v[1]); 
    return 1; 
} 

Я понимаю, что первый элемент указателя на указатель получает значение 12, но линия после того, что я просто не могу понять. Получает ли второй элемент в первом указателе значение 13?

+0

Так что же вам говорит ваш выход? –

+1

Этот код приводит к ошибке выполнения –

+0

Внутри функции 'x' имеет тип' int ** '. Поэтому '* x' имеет тип' int * ', а' * x + 1' - это арифметика указателя: результат является указателем на один * элемент * прошлый '** x'. '* (* x + 1)' обозначает 'int' в этой позиции; он по определению точно эквивалентен '(* x) [1]'. Итак, да, последняя строка функции устанавливает второй 'int' в динамически выделенном блоке на 13. –

ответ

1

код довольно легко понять, если использовать временную переменную, например:

void afunction(int**x) 
{ 
    int* t = *x; 

    t = malloc(2 * sizeof(int)); 
    *t = 12; 
    *(t+1) = 13; 
} 

так:

  • x является указателем на указатель на int
  • *x дает int* (указатель к int)
  • **x =, как *(*x) =, так что вы сначала получить указатель на int затем разыменовывая вы можете установить значение по адресу

Последняя часть *(*x+1) = может быть разбита:

int* pointerToIntArray = *x; 
int* secondElementInArray = pointerToIntArray + 1; 
*secondElementInArray = 13; 

Цель используя указатель на указатель здесь, вы можете передать адрес функции int* и позволить функции распределять память и заполнять ее данными. Такую же цель можно было бы сделать, возвратив int*, например:

int* afunction() { 
    int* x = malloc(sizeof(int)*2); 
    *x = 12; 
    *(x+1) = 13; 
    return x; 
} 

int main() { 
    int* v = afunction(); 
    return 0; 
} 
Смежные вопросы