| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1959 人关注过本帖
标题:写单链表时,为什么传入结构指针不可以初始化,而对于插入删除时传入结构指 ...
只看楼主 加入收藏
DBZ002
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2016-9-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
写单链表时,为什么传入结构指针不可以初始化,而对于插入删除时传入结构指针却可以改变其指向?
单链表的存储结构:

typedef struct NOde

{ ElemType data;

struct Node *next;

}Node,*LinkList;

//初始化  

void InitList (Linklist L)

{    L =(Linklist)malloc(sizeof(Node));

      L->next=NULL;

}//这样写为什么不可以呢

//void insert(Linklist L){......}//插入是可以的
搜索更多相关主题的帖子: insert 
2016-09-27 22:13
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:20 
跟指针没啥关系

C语言传递参数 是值传递,是复制。

你再InitList试图对L赋值,影响不到外面的L的。

φ(゜▽゜*)♪
2016-09-27 22:25
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
以下是引用书生牛犊在2016-9-27 17:07:14的发言:

写代码的时候用到指针的话,你自己务必搞清楚指针自己是谁,它每个时刻应该指向了谁。如果搞不清楚那就printf("%p",&_)输出看看。
#include  
#include  
#include  
 
void fun1(int *a) {
    *a=1;//关键是*号,这是向a所指向的地址上写数据的一个运算符。
    printf("fun1 a & %d\n",&a);//输出a,的地址
    printf("fun1 a = %d\n",a);//输出a保存的数据,也是一个指针
 
    printf("如果你在这里面用了malloc,看看会发生什么事吧\n");
    a=(int*)malloc(sizeof(int));
    printf("fun1 a & %d\n",&a);
    printf("fun1 a = %d\n",a);
    printf("看到了吗?这里的a自己的地址没变,但是,他所保存的信息已经变了,这时候*a=5又是另一个int变量的事了\n");
    *a=5;
}
void fun2(int a) {
    a=2;
}
 
int* fun3(){
    int *a=(int*)malloc(sizoef(int));
    *a=3;
    return a;
}
 
 
int main() {
    int a=0;
    printf("调用fun1函数之前:\n");
    printf("main a & %d\n",&a);
    printf("main a = %d\n",a);
 
    printf("-----------------\n") ;
    fun2(a);
    fun1(&a);
    printf("-----------------\n") ;
 
    printf("回到main函数之后:\n");
    printf("main a & %d\n",&a);
    printf("main a = %d\n",a);
 
    printf("总结,指针说白就是一个变量,这个变量保存的数据是地址。是在计算机内存中一个真实的地方。");
    printf("任何变量、函数都有地址,指针自己也有。") ;
    printf("而和其他类型数据一样,我们可以修改他所保存的数据。所以指针用不好也很头疼,因为编译器检查不了这样的问题。");
    printf("C语言函数传参机制就是复制。复制值。而不是真的传递这个变量。");
    printf("他会在函数内部对应形参列表建立几个对应类型的变量,并把外面的值复制赋值给函数内部的变量。") ;
    printf("这是为什么fun2做的会是无用功。(我想这一定所有学指针的人都懂的。不懂得拉出去枪毙)") ;
    printf("*a=1,是访问a所保存的地址,并向那个地址写数据。但他并不能检查这块地址是否有效。因为计算机编码说到底只有01。") ;
    printf("(有些地址被计算机列为不可修改的地址。如果你试图向他们写入数据就会导致程序崩溃)");
    printf("比如:int*p=NULL; *p=1;或者Link*p=NULL;p->Next;都会直接奔溃(后者出错更加常见,程序运行一碰到NULL->..就炸了)") ;
   
 
    printf("原则上,我推荐fun3()这样内部建立全部数据然后传递一个指针出来,");
    printf("除非必要,尽量避免像fun1()那样传个地址进来做操作。光是写*号就能让你的代码看起来七荤八素");
   
 
    printf("慎用指针!");
 
    printf("慎用指针!");
    printf("慎用指针!");
    printf("懒得逐行打'\n'了,将就着代码页看吧");
 
    return 0;
}




φ(゜▽゜*)♪
2016-09-27 22:29
快速回复:写单链表时,为什么传入结构指针不可以初始化,而对于插入删除时传入结 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035533 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved