指针做参数 二级指针的详细分析

class data
{
public:
        int a;     
};

void fun1(data* para)/**********************************/
//
{
  /*当掉用时
  data* data1 = NULL;
  fun1(data1);
  本函数实际上是有个临时变量
  data *para = data1;
  此时所有的操作都是对para进行的操作而不是data1
  
  如果是fun1(data ** para)
  调用fun1(&data1)
  此时将data1的地址传进来
  即可以通过*para操作data1的地址 所以可以传出去。
  */
        para = new data();
}

data* fun2(void)
{
        return new data();
}

void fun3(data* &para)
{
        para = new data();
}

void main(void)
{
      data* data1 = NULL;
      data* data2 = NULL;
      data* data3 = NULL;
      fun1(data1);       //错误
     data2 = fun2();  //正确
     fun3(data3);        //正确
}

编译器总是要为函数的每个参数制作临时副本。
如果函数体内的程序修改了副本的内容,就导致参数的内容作相应的修改。
在本例fun1中,para的副本申请了新的内存,即副本所指的内存地址和参数所指的内存地址不一致了。
所以在fun1中修改的参数内容在函数返回后para还是NULL


void find1(char [] array, char search, char * pa) 再看调用处:find1(str,a,p); 请仔细考虑此时形实结合所发生的事:array得到了数组名str,search得到了a的值, pa得到了p的值(而非p的地址)!可见尽管使用了指针,也并没实现传址,当实参形参都是指针时,它们也仅仅是传值。 画出内存使用图示就清楚了

 

修改 find2(char [] array, char search, char ** ppa)
主函数的调用处改如下:find2(str,a,&p);//调用函数以实现操作。 这样形实结合所发生的操作如下:         ppa=&p;
 ppa是指向指针p的指针。 对*ppa的修改就是对指针p的修改。

 

 

注意与下一个例子相区别。
void func( int *data)
{
 *data = 4;
}
void main()
{
 int *s = NULL;
 s = (int *)malloc(sizeof(int));/*在main里申请的地址
 现在s指向的是申请的地址 调用func(s)时 data = s 传值 是将s的值传给了 data 于是data s 里放的是相同的地址 即s data指向的地址相同
 此时对*data的操作 同*s的操作是一样的 因为操作的是同一个地址
 这里要注意同 在函数里malloc的相区别
 例子:
 func( int *data)
 {
  data = (int *) malloc(sizeof(int));
 }
 当掉用此函数(func(s))时 data的值同样是接收到了 s的值(s所指向的地址)但是紧跟着就把 data所指向的位置改变了 所以data已经和s脱离关系。
 */
 *s = 0;
 printf("%d/n", *s);
 func(s);
 printf("after func %d/n", *s);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值