/*为了便于理解,下面的代码是一个抽象的类似于链表的函数操作*/
#include<stdio.h>
#include<stdlib.h>
#define TTEM int
typedef TTEM * intp;
intp test1(intp pf);
/*类似于普通变量的传值函数*/
intp test2(intp *pf);
/*类似于普通变量的传址函数*/
int main(void)
{
intp p1,p2;
int a1 = 1,a2 = 2;
p1 = &a1;
p2 = &a2;
printf("*p1:%p,%d\n",p1,*p1);
printf("*p2:%p,%d\n",p2,*p2);
printf("%s\n",test1(p1));
/*地址为空,即(void*)0 == null*/
printf("%s\n",test2(&p2));
/*地址为空,即(void*)0 == null*/
/*注意:0,null和'\0'虽然数值是相等的,但是意义不同,不懂请百度*/
putchar('\n');
printf("*p1:%p,%d\n",p1,*p1);
/*函数没有改变[指针变量]的值*/
printf("*p2:%p,%d\n",p2,*p2);
/*空指针异常,导致奔溃*/
/*运行到这一句,程序奔溃*/
system("pause");
return 0;
}
/*传值函数,得到一个[副本],不会影响原[变量]*/
intp test1(intp pf)
{
pf = NULL;/*将该[变量]的内容置空*/
//*pf = 1000;
/*对于pf指向的变量是可以改变的*/
return pf;
}
/*传址函数,沿用原[变量],会影响原[变量]*/
intp test2(intp *pf)
{
*pf = NULL;/*将该[变量]的内容置空*/
//**pf = 1000;
/*对于pf指向的变量是可以改变的*/
return *pf;
}
/*上述的[副本]指[指针变量]存储的[内容副本]*/
/*[内容副本]指存储数值变量的[地址],如变量a1,a2*/
/*上述将的[变量]是指[指针变量]*/
/*
*
通过上面的代码得出:
①如果使用[intp]变量做参数,变量pf在函数中的改变不能影响到主函数中传递过来的相应变量;<-test1
②如果使用[intp *]变量做参数,变量 pf在函数中的改变能影响到主函数中传递过来的相应变量;<-test2
注意:请将intp类型和int类型的做参数的函数进行类比,如果你到现在还没有看懂
*/