通过引用传递C指针?

时间:2016-04-05 18:14:14

标签: c list pointers reference

我找到了一些通过引用传递指针的条目,但并没有真正理解它们。

我已编写此函数以在链表中插入节点。它似乎在函数内工作,但linkedList指针的更改不会影响主函数中的指针。有一个简单的解决方案吗?在课堂示例中,linkedList指针是全局声明的,但我认为最好传递它,所以我可以创建多个链表。

void insert(node* linkedList, int value)
{
    node* newNode = malloc(sizeof(node));

    if (newNode == NULL)
    {
        // failed to make node
        printf("Failed to insert new node!\n");
        return;
    }

    newNode->n = value;

    printf("\n");
    printf("Before insert: \n");
    printf("\n");

    printf("linkedList ptr : %p\n", linkedList);
    printf("linkedList->n : %i\n", linkedList->n);
    printf("LinkedList->next : %p\n", linkedList->next);

    printf("\n");
    printf("newNode ptr : %p\n", newNode);
    printf("newNode->n : %i\n", newNode->n);
    printf("newNode->next : %p\n", newNode->next);

    newNode->next = linkedList;
    linkedList = newNode;

    printf("\n");
    printf("After insert: \n");
    printf("\n");

    printf("linkedList ptr : %p\n", linkedList);
    printf("linkedList->n : %i\n", linkedList->n);
    printf("LinkedList->next : %p\n", linkedList->next);

    printf("\n");
    printf("newNode ptr : %p\n", newNode);
    printf("newNode->n : %i\n", newNode->n);
    printf("newNode->next : %p\n", newNode->next);
}

2 个答案:

答案 0 :(得分:1)

我认为一个简单的解决方法是更改​​你的函数以返回新的列表头:

Node * insert( struct Node * list, int value )
{
    ...
}

像这样使用:

myList = insert( myList, someNumber )

很难用没有图片来解释你想要的用例。您希望将指针传递给指向insert()的列表头指针。在insert()内,您可以修改指针指针指向的内容(取消引用它)以更改列表头。

声明你的函数:

void insert( struct Node ** ioList, int value ) { ... }

此处ioList的类型为Node **,它是指向Node的指针。 (经验法则:从右到左阅读类型)

这样称呼:

struct Node * myList = /*create list here*/ ;
insert( &myList, /*some number*/ );

&运算符创建指向它的参数的指针。所以我们得到一个指向myList的指针。 (这是指向Node

的指针

现在我们有一个指向myList的指针。

insert内,分配给*ioList以更改ioList指向(myList)的内容:

// make myList point to the new list head:
*ioList = /*new list head*/

答案 1 :(得分:0)

指针指向内存中的某个位置。您的函数创建一个新的内存位置,并将其分配给已按值传递的指针。我假设您正在尝试将新节点添加到现有链接列表中。

不幸的是,您的功能不会以这种方式运行,因为您每次都会为链接列表分配一个新地址。

我喜欢使用稀疏数组。如果您知道列表的最大大小,它们比存储可能必须在以后重新分配的结构的连续内存位置更容易使用。

void insert(struct node* list[], int *currentIndex, int value)
{
    struct node * newNode;

     newNode = malloc(sizeof(node));
     list[*currentIndex++] = newNode;

     ....
}