2015-12-23 2 views
1

Я пытаюсь сделать один связанный список для Python, используя C api. Этот материал работает:Один связанный список для python с использованием C api

typedef struct list { 
    int item; 
    struct list *next; 
} list; 

void insert(list **self, int item) { 
    list *p = malloc(sizeof(list)); 
    p->item = item; 
    p->next = *self; 
    *self = p; 
} 

int main() { 
    list *myList = NULL; 
    insert(&myList, 1); 
    return 0; 
} 

но Python C использование API * самостоятельно, а ** я. Итак, как это работает, если функция вставки будет выглядеть так:

void insert(list *self, int item) { 
+0

в примере, который вы показываете, функция 'insert' принимает указатель на указатель на' list'. Первый указатель затем разыменовывается, чтобы читать, а затем менять указатель, указывающий на структуру «list». Вы спрашиваете, как это сделать для чтения и изменения, если указатель на структуру списка ('list * self') передается функции вместо указателя на указатель? –

+0

Да. Я хочу отправить myList в вставку без амперсанда –

+0

решение для чего вы хотите получить доступ с помощью 'self' вместо' * self', то есть 'p-> next = self;', но это также означает, что, self = p; 'на следующей строке, вы только изменяете копию своей функции этого указателя, и вызывающий не увидит изменения. Способ обойти это заключается в передаче указателя на указатель, как в коде, который вы указали. Что именно вам нужно делать? –

ответ

1

Ну, вы можете просто опускать *, то есть:

void insert(list *self, int item) { 
    list *p = malloc(sizeof(list)); 
    p->item = item; 
    p->next = self; 
    self = p; 
} 

Но я не думаю, что это будет вести себя как вы ожидаете, потому что строка self = p фактически не изменит тот же указатель, который использовал вызывающий. Ваша функция получает отдельную копию *self при ее запуске (C - pass-by-value). Если вы хотите что-то изменить в функции и показать вызывающему абоненту изменение, обычный подход заключается в использовании указателя - поэтому вам не нужно изменять копию указателя, переданного в функцию, но вы можете использовать его для доступа к той же части памяти, с которой работал вызывающий. В вашем случае вызывающий работает с указателем на myList, поэтому, если вы хотите, чтобы функция меняла значение этого указателя, вам нужен указатель на указатель i.e list **self.

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