关于函数的“地址传递”问题
用数组名传递函数实参的时候,
实参和形参指向的是同一个地址;
为什么用指针传递的时候,实参和形参指向不同的地址?
数组的:
#include <stdio.h>
int max(int a[10])
{
int i;
int sum=0;
for(i=0;i<10;i++)
sum=sum+a[i];
printf("%d ",a);
return sum;
}
int main()
{
int x[10]={1,1,1,1,1,1,1,1};
int mysum;
mysum=max(x);
printf("%d ",x);
}
指针的:
#include <stdio.h>
void swap(int *p1,int *p2)
{
int *p;
p=p1;
p1=p2;
p2=p;
printf("%d ",p1);
}
int main()
{
int a=5,b=9;
int *pa,*pb;
pa=&a;
pb=&b;
swap(&a,&b);
printf("%d %d",pa,pb); 想实现a,b的交互,但没有交换,为什么?
}
[解决办法]
C语言中指针也是一类特殊的类型而已。指针有自己的地址和内容,而内容就是它指向的东西的地址。int *p。那么p表示其指向内容的地址,*p表示指向的内容。
[解决办法]
要这样改一下就好了。
void swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=*p;
printf("%d ",*p1);
}
[解决办法]
函数的传参的时候有个临时变量和这个变量的生命周期,比如说 void swap(int *p1, int *p2),从swap函数内部看,对p1,p2取值确实达到了交换值的目的,但是swap函数调用一结束,p1,p2记录的地址值就失效了(p1,p2变变量是在栈上分配的),最终调用完swap()函数之后,pa还是指向a变量地址,pb指向b变量地址。
[解决办法]
1 打印地址不应该用%d,而应该用%p
printf("%p ",x);
2 指针和数组作为参数参入都是将地址传入,用数组是一样,用指针也是一样的
第二个代码,应该p1=p2,有过一次赋值,所以p1指向的地址改成p2的了,你看结果应该,可以看出,p1
和pb打印出的地址一样
3 p1和p2是swap函数栈中的两个局部变量,在栈中完成了p1 p2指向互换,但是这只是swap内的两个局部变量,并没有修改传入的实参&a &b这两块内存做出修改,想要达到交换的目的,可以采用2楼的方法