鱼C论坛

 找回密码
 立即注册
查看: 1898|回复: 8

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

[复制链接]
发表于 2016-5-30 07:31:17 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 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的别名变量
无标题.png

最佳答案

查看完整内容

你看下你的LinkList是啥 肯定是类似这种 typedef Node { .... }* LinkList; 那么定义 LinkList r 就是 Node* r r自然是个指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-30 07:31:18 | 显示全部楼层
a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊


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

那么定义 LinkList r
就是 Node* r
r自然是个指针
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-30 09:31:34 | 显示全部楼层
r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变

换句话说 对于p所指向的节点, 即内存地址上这块地址 指针r也指向了它
r和p都有同样的权限去读写其中的结构体变量
不管谁改变了其中的内容, 另一个都会看到这种改变现象
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-30 09:50:33 | 显示全部楼层
无论是r或者p都是指向一块malloc空间的指针,每次循环的最后r=p;使r指向了p指向的空间,那么通过指针r一样可以操作这块空间, 下一次循环开始p指向了新申请的空间,而r仍然指向刚刚的空间,那么r->next = p就将刚刚的空间和新申请的空间连了起来,形成链表。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-30 11:36:25 | 显示全部楼层
ryxcaixia 发表于 2016-5-30 09:31
r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变

那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-5-30 11:37:23 | 显示全部楼层
a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊

LinkList p, r;我这里声明r是变量并不是LinkList *p这样声明的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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;
 }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-5-31 22:29:54 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-16 11:38:36 | 显示全部楼层
123
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-27 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表