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的别名变量 a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊
你看下你的LinkList是啥
肯定是类似这种
typedef Node
{
....
}* LinkList;
那么定义 LinkList r
就是 Node* r
r自然是个指针
r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变
换句话说 对于p所指向的节点, 即内存地址上这块地址 指针r也指向了它
r和p都有同样的权限去读写其中的结构体变量
不管谁改变了其中的内容, 另一个都会看到这种改变现象 无论是r或者p都是指向一块malloc空间的指针,每次循环的最后r=p;使r指向了p指向的空间,那么通过指针r一样可以操作这块空间, 下一次循环开始p指向了新申请的空间,而r仍然指向刚刚的空间,那么r->next = p就将刚刚的空间和新申请的空间连了起来,形成链表。
ryxcaixia 发表于 2016-5-30 09:31
r=p
这句就是r指向p
两个指针指向了同一块内存地址, 一变都变
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊 a1362398994 发表于 2016-5-30 11:36
那请问下r是指针吗?指针的我的前面并没有声明为指针呀,我前面声明r是一个变量啊
LinkList p, r;我这里声明r是变量并不是LinkList *p这样声明的啊 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;
}
看看 123
页:
[1]