首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于函数的“地址传递”有关问题

2012-06-14 
关于函数的“地址传递”问题用数组名传递函数实参的时候,实参和形参指向的是同一个地址;为什么用指针传递的

关于函数的“地址传递”问题
用数组名传递函数实参的时候,
实参和形参指向的是同一个地址;

为什么用指针传递的时候,实参和形参指向不同的地址?

数组的:

#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楼的方法

热点排行