指针传递参数实例:
void fun1( int *p ) //此函数接受一个指针p,也就是说p是别人传过来的一个int类型的地址
{
printf(" %d", p); ///打印p的值,注意p是地址,所以打印的是一个内存地址
printf("%d", *p); ///打印指针p所指向的内存单元的值,那要看p是谁传过来的,它以前值是多少?
*p = 0; ///把p所指向的内存单元赋值为0
}
main()
{
int a = 90; ///定义一个整形变量,存放90
fun1( &a) ; //调用fun1函数,并把变量a的地址传递过去
//注意,a刚开始存放的是90,执行完后a内容就变成0了
}
希望能帮到你,望采纳哈!
#include
main ()
{int m=1,n=2,*p=&m,*q=&n,*r;//p指向m,q指向n
r=p;p=q;q=r; //交换后p指向n,q指向m
printf("%d,%d,%d,%d\n",m,n,*p,*q);//m,n虽然没变;*p(即n)与*q(即m)却有了变化。
}
至于第二段代码只是通过主函数调用另一个全局函数来作,结果一样。
不过你第二段代码中#include
补充一点:如果要用指针或引用来交换变量数值,代码却不是像上面的用法。
就本问题来说:因为虽然交换了指针但指针所指向的变量却丝毫没有变化。
指针保存了变量的地址,交换变量的值,必须用解引用后的指针才能办到:
如:
void swap1(int *x,int *y)
{
int *tmp=x;
x=y; //交换了指针x和y,x和y所指向的变量却没有交换
y=tmp;
}
void swap2(int *p,int *q)
{
int tmp=*p;
*p=*q; //通过指针解引用,交换了指针所指向的变量
*q=tmp;
}
进一步说:这就是深复制和浅复制的区别。
第一题
p=&m;// p存放变量m的地址,或者说p指向m
q=&n; // q存放变量n的地址
r=p; //r存放指向m的地址
p=q; //p存放指向n的地址
q=r; //q存放指向m的地址,结果p和q通过r交换了所指对象,p和q的内容改变了
第二题:
p=&x;q=&y; //p指向x,q指向y
fun(p,q); //p存放的内容(x的地址)通过函数调用传递给变量a,则a也指向x,同理b指向y
c=a;a=b;b=c; //修改变量a,b,c的内容,而这三个变量属于函数fun,返回时被放弃
fun(&x,&y); //与上面用p和q调用的实质完全相同,函数中不操作变量指向的内容,而仅倒腾变量本身,对主程序中的x和y没有影响,也没改变p和q的内容
第一题,m=1,n=2所以先输出了1和2,然后p指针指向m,q指针指向n。在r=p;p=q;q=r;进行指针值交换后,p指向了n的地址,q指向了m的地址。所以输出了2,1。
第二题,第一次输出的是p和q指向的对象,输出3和5。
随后传入fun函数的是x和y的地址指针,但是只是交换了指针值,这并不影响到主函数中的指针p和q的值。所以输出来的数依然是3和5。
很简单的
实参里面写的是地址,形参里写的是指针,比如int *p=1; 有一个函数定义为f(int *p){ xxxxx } 调用这个函数时用f(p) 这样子
再举个例子 如果int a=1; 调用f时要写 f(&a) 这样子 就这么传参数