c语言,有关指针和链表的问题
函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。图中画红色那里,为什么写p可以,写*p或者*p->data都不行?要是括号里...
函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。图中画红色那里,为什么写p可以,写*p或者*p->data都不行?要是括号里不写地址(指针)写成对象应该怎么写?程序如下#include <stdio.h>#include <conio.h>#include <stdlib.h>typedef struct aa{ int data; struct aa *next;} NODE;int fun (NODE *h){ int sum=0; NODE *p; p=h->next;/*************found**************/ while (p) { if(p->data%2==0) sum+=p->data;/*************found**************/ p=p->next; } return sum;}NODE *creatlink(int n){ NODE *h,*p,*s; int i; h=p=(NODE*)malloc(sizeof(NODE)); for(i=1;i<n;i++) { s=(NODE*)malloc(sizeof(NODE)); s->data=rand()%16; s->next=p->next; p->next=s; p=p->next; } p->next=NULL; return h;}outlink(NODE *h){ NODE *p; p=h->next; printf("\n\n The LIST :\n\n HEAD"); while(p) { printf("->%d",p->data); p=p->next;} printf("\n");}void main(){ NODE *head; int sum; system("CLS"); head=creatlink(10); outlink(head); sum=fun(head); printf("\nSUM=%d",sum); }
展开
1个回答
展开全部
while(p)相当于while(p!=NULL),判断的是p是否为空指针
如果写while(*p->data)的话,那么判断的是p所指向的结构体的data域是否为零。然而,由于没有判断p是否有效,若p为野指针,将导致*p非法访问,从而使程序崩溃。因此这种写法是错误并且危险的。
如果写while(*p->data)的话,那么判断的是p所指向的结构体的data域是否为零。然而,由于没有判断p是否有效,若p为野指针,将导致*p非法访问,从而使程序崩溃。因此这种写法是错误并且危险的。
追问
p要是为NULL的话就叫无效嘛?
追答
p为NULL相当于p=0,就是p为空指针、无效指针的意思。
此外还有野指针,即指向未知内存的指针,它可能是NULL也可能是某个未知地址,这样的指针是最危险也是最不容易被察觉的。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询