指针算术

时间:2014-01-19 21:44:25

标签: c linked-list singly-linked-list

我创建了一个包含十个节点的链表。我想获取我在链表中​​创建的第一个节点的地址。我收到的第一个节点的地址值不正确。这是我写的代码:

#include "singlyLinkedList.h"
#include <stddef.h> //for NULL
#include <stdlib.h> //for malloc
#include <stdio.h> //for printf

node *pNode;

void CreateLinkedList()
{
    int i;
    pNode = (node*)malloc(sizeof(node)); //create space for first node []
    for(i=0;i<10;i++)
    {
        pNode->element = i; //enter value [0]
        printf("Value is %d addr is %p\n",pNode->element,pNode);
        pNode->nextPtr = (node*)malloc(sizeof(node)); //[0]->[]->NULL
        pNode = pNode->nextPtr;
    }
    pNode->nextPtr=NULL;
}

//Function to get first node address
void GetFirstNodeAddress()
{
    pNode = pNode-10*(sizeof(node));
    printf("\n *** Value is %p",pNode);
}


int main()
{
    CreateLinkedList();
    GetFirstNodeAddress();
}

3 个答案:

答案 0 :(得分:3)

你假设你做的10个malloc会产生10个连续的地址。你处理它就好像它是一个数组,但链表的元素是独立的。

这些链接列表通常的工作方式是初始化它们并保留稍后返回的第一个指针。然后在尾巴上生长更多元素。你不能在一个链表中倒退。

我今天在earlier post

中提供了一个代码示例

答案 1 :(得分:2)

在链表实现中不使用指针算法,至少不是微不足道的。而且你填写的列表不正确。你需要保留头指针。这是一种这样做的方式:

// Note: do NOT invoke on a non-empty pNode list
void CreateLinkedList()
{
    node **pp = &pNode; 
    int i;

    for (i=0;i<10;++i)
    {
        *pp = malloc(sizeof(**pp));
        (*pp)->element = i;
        pp = &(*pp)->nextPtr;
    }
    *pp = NULL;
}

如何运作

就像pNode是指向node的指针一样,pp是指向node *的指针。在循环的生命周期中pp始终保持下一个指针的地址即将填充新的节点分配。在分配和节点设置之后,pp将填充刚刚创建的节点的nextPtr指针的地址。这一直持续到填充结束。此时,pp寻址的指针是尾部nextPtr,并且应该以空终止(这是*pp = NULL所做的)。在调试器中逐步执行此代码,以更好地了解它的工作原理。

就个人而言,我会将头指针的地址作为参数传递,但这是让代码运行的直接方法。

答案 2 :(得分:-2)

试试printf("\n *** Value is %p",(void *) &pNode);。 &安培;通常是获取指针地址的最简单方法

也是我所知道的:pNode = pNode-10*(sizeof(node));不正确。

当你在做指针时,它们指向内存中不一定是连续的区域(在内存中按顺序排列)。意思是你可以有一个指向内存块5-10的指针,它也有一个指向内存块83-88的指针。如果要获取第一个节点,请创建一个pNode rootNode并将第一个创建的pNode分配给该节点。然后你可以在一个while循环中遍历它,也可以打印出上面列出的地址或你想要的任何其他地址。