鱼C论坛

 找回密码
 立即注册
查看: 2279|回复: 2

函数调用时什么时候需要用指针,什么时候用值?

[复制链接]
发表于 2018-11-3 22:05:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define error 0
#define ok 1
#define true 1
#define false 0

typedef int Status;
typedef int Elemtype;
typedef struct Node
{
        Elemtype data;
        struct Node *next;
}Node;

typedef struct Node* Linklist;        //指向节点类型的指针,用linklist表示。

                                               
/*将子函数写在主函数上面就可以不同写声明。原因在于程序从上至下开始执行。
Status initlist_l(Linklist *L);
Status listlengh(Linklist L);
Status creatlist(Linklist *L, Elemtype n);
Status show(Linklist L);
Status getmidnode(Linklist L);
*/

Status initlist_l(Linklist *L)//初始化链表
{
        *L = (Linklist)malloc(sizeof(Node));        //产生头结点,病史L指向头结点

        if(!(*L))
        {
                return error;
        }
        (*L)->next = NULL;
        return ok;
}

Status listlengh(Linklist L)//链表长度
{
        Elemtype i = 0;
        Linklist p = L->next;

        while (p)
        {
                i++;
                p = p->next;

        }
        return i;
}

Status creatlist(Linklist *L, Elemtype n)//创建链表
{
        Elemtype i = 0;
        Linklist p;
        *L = (Linklist)malloc(sizeof(Node));
        (*L) -> next = NULL;
        srand(time(0));        //播种
        for(i=0; i<n; i++)
        {
                p = (Linklist)malloc(sizeof(Node));
                p ->data = rand()%100 +1;        //取1-100的随机数
                p->next = (*L)->next;
                (*L)->next = p;
        }

        return ok;
}

Status show(Linklist L)//显示链表元素
{
        Linklist p = L->next;
       
        while(p)
        {
                printf("%d\t", p->data);
                p = p-> next;
        }
        printf("\n");
        return ok;
}

Status getmidnode(Linklist L)//获得中间节点的值
{
        Linklist mid;
        Linklist fast;
        mid = fast = L;
        while (fast->next != NULL)
        {
                if(fast ->next ->next != NULL)
                {
                        fast = fast ->next ->next;
                        mid = mid->next;
                }
                else
                {
                        fast = fast->next;
                }
        }
        return mid->data;
}

int main()
{
        Elemtype n = 10, i ;
        Linklist L;        //作为头结点,
        char ch;
        int op;


        i = initlist_l(&L);
        printf("初始化L后,链表长度为%d\n", listlengh(L));
        printf("1.创建链表\n2.查看链表\n3.链表长度\n4.中间节点值\n0.退出\n");

        while (op != 0)
        {
                scanf("%d", &op);
              while ((ch = getchar()) != EOF && ch != '\n')                //文件末尾或者确定键(stdin输入的)
                {
                  ;
                } ///清除缓存区的确定键
                switch(op)
                {
                case 1:
                        creatlist(&L, n);
                        show(L);
                        break;
                case 2:
                        show(L);
                        break;
                case 3:
                        printf("链表长度为:%d\n", listlengh(L));
                        break;
                case 4:
                        printf("中间节点的值为:%d\n", getmidnode(L));
                        break;
                case 0:
                        exit(0);
                default:
                        printf("请重新输入选项(仅限0-4):");

                }


        }

        return 0;
}




如上为什么创建函数的时候不用直接传L???而必须写为*L?????
求大佬讲解一下!!!!!!!1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-11-4 11:05:34 | 显示全部楼层
当你需要改变L的值的时候就必须要传*L,通过指针间接修改变量的值,如果在被调函数中仅仅是读L的值不需要改变,这是传L就可以啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-4 16:31:10 | 显示全部楼层
moc 发表于 2018-11-4 11:05
当你需要改变L的值的时候就必须要传*L,通过指针间接修改变量的值,如果在被调函数中仅仅是读L的值不需要改 ...

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 01:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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