a1362398994 发表于 2016-5-30 07:31:17

C语言结构体的指针问题?

本帖最后由 n0noper 于 2016-6-1 10:19 编辑

/* 尾插法建立单链表演示 */

void CreateListTail(LinkList *L, int n)
{
    LinkList p, r;
    int i;

    srand(time(0));
    *L = (LinkList)malloc(sizeof(Node));
    r = *L;

    for( i=0; i < n; i++ )
    {
      p = (Node *)malloc(sizeof(Node));
      p->data = rand()%100+1;
      r->next = p;
      r = p;               // 备注:初学者可能很难理解这句,重点解释。
    }

    r->next = NULL;
}

这个里面为什么改变了r的next指向就改变了上一个节点P的next指针,r又不是p的别名变量

ryxcaixia 发表于 2016-5-30 07:31:18

a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊

你看下你的LinkList是啥
肯定是类似这种
typedef Node
{
    ....
}* LinkList;

那么定义 LinkList r
就是 Node* r
r自然是个指针

ryxcaixia 发表于 2016-5-30 09:31:34

r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变

换句话说 对于p所指向的节点, 即内存地址上这块地址 指针r也指向了它
r和p都有同样的权限去读写其中的结构体变量
不管谁改变了其中的内容, 另一个都会看到这种改变现象

skyseawing 发表于 2016-5-30 09:50:33

无论是r或者p都是指向一块malloc空间的指针,每次循环的最后r=p;使r指向了p指向的空间,那么通过指针r一样可以操作这块空间, 下一次循环开始p指向了新申请的空间,而r仍然指向刚刚的空间,那么r->next = p就将刚刚的空间和新申请的空间连了起来,形成链表。

a1362398994 发表于 2016-5-30 11:36:25

ryxcaixia 发表于 2016-5-30 09:31
r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变


那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊

a1362398994 发表于 2016-5-30 11:37:23

a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊

LinkList p, r;我这里声明r是变量并不是LinkList *p这样声明的啊

skyseawing 发表于 2016-5-30 12:52:21

void CreateListTail(LinkList *L, int n)
{
   LinkList *p, *r;
   int i;

   srand(time(0));
   L = (LinkList *)malloc(sizeo(LinkList ));
   r = L;

   for( i=0; i < n; i++ )
   {
         p = (Node *)malloc(sizeof(Node));
         p->data = rand()%100+1;
         r->next = p;
         r = p;               
   }

   r->next = NULL;
}

flyskyltq 发表于 2016-5-31 22:29:54

看看

flyskyltq 发表于 2016-6-16 11:38:36

123
页: [1]
查看完整版本: C语言结构体的指针问题?