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