链表c语言指针没有初始化,写单链表时,为什么传入结构指针不可以初始化,而对于插入删除时传入结构指针却可以改变其指向?...

以下是引用书生牛犊在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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值