参数传递之指针传递

(1)基础知识
C课本上的一个程序:

void swap(int *p1,int *p2)
{
  int t=*p1;
  *p1=*p2;
  *p2=t;
}

void main()
{
  int a=1,b=2;
 
  swap(&a,&b);
 
  ...
}

a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。
为了看得更清楚些,更改一些:

void swap(int *p1,int *p2)
{
  int t=*p1;
  *p1=*p2;
  *p2=t;
}

void main()
{
  int a=1,b=2;
  int *pa=&a,*pb=&b;
 
  swap(pa,pb);
 
  ...
}

在上面,pa,pb是形参,p1,p2是实参。pa=&a,p1=&a;pb=&b,p2=&b。但pa与p1不是同一个内存区域的指针,pb与p2也一样。


(2)问题

再看一个程序:


为程序分配内存区域,你可以这样做:

#define SIZE 100

void main()
{
  int *p;
 
  p=(int *)malloc(SIZE*sizeof(int));   //malloc为指针p分配内存
 
  ...
}

不能这样做:

#define SIZE 100

int my_malloc(int *q);

void main()
{
  int *p;
 
  my_malloc(p);
 
  ...
}

int my_malloc(int *q)
{
  q=(int *)malloc(SIZE*sizeof(int));  //malloc为指针q分配内存
}

因为当p作为形参传递时,只是传递p的地址给q,即p,q是两个指向相同地址的两个不同指针。在my_malloc函数中只是为q分配内存区域,并不是为p分配。


(3)
解决办法将指针传递给要调用的函数

#define SIZE 100

int my_malloc(int *q);

void main()
{
  int *p;
 
  my_malloc(&p);                      //传递指针p的地址给**p
 
  ...
}

int my_malloc(int **q)                //**q是指向指针p的一个指针                
{
  *q=(int *)malloc(SIZE*sizeof(int)); 
}

 

如果你用的是C++,你还可以用引用"&"的办法:

#define SIZE 100

int my_malloc(int *q);

void main()
{
  int *p;
 
  my_malloc(p);                     
 
  ...
}

int my_malloc(int *&q)                //*q是指针p的一个引用                
{
  q=(int *)malloc(SIZE*sizeof(int)); 
}


--------------------------------------------------------------------
传递指针在函数中分配内存的危险的,上面的程序只是传递指针一个例子。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值