伟值和传址,指向指针的指针(疑问)解决办法

伟值和传址,指向指针的指针(疑问)
"c++语言支持传值调用和传址调用(引用调用),而c只支持只支持传值调用不支持传址调用"
这里的引用调用是不是指:
1.f(int   &)       //引用
2.   f(int   *)不着 //指针
这两种?
void   add(int   aa,   int   bb,   int   *sum){
        *sum=aa+bb;
}
main(){
        int   a,b,*c;
        a=12;
        b=21;
        c=(int*)malloc(sizeof(int));
        *c=0;
        add(a,b,c);
        printf( "a+b=%d ",*c);
}
"假设sum所指的是0002H.所以*sum对0002H中的值进行了修改为33,当回到主函数时,取*c的值读出了33,这也就达到了参数回传的目的,让sum函数中做的操作反应到了主函数,所以说这是一个传值过程????"这说的不懂

指向指针的指针
为什么第一种可以第二种不可以,
void   lq_ins2(hpt,x)
NODE   **HPT;   //   链表头指针
int   x;         //这两个参数的定义好怪,别扭
{
NODE   *U;
U=(NODE*   )MALLOC(sizeof(NODE));
U-> data=x;
u-> link=*hpt;
*hpt=u;
}
void   lq_ins2(hpt,x)
NODE   *HPT;   //   链表头指针
int   x;        
{
NODE   *U;
U=(NODE*   )MALLOC(sizeof(NODE));
U-> data=x;
u-> link=*hpt;
hpt=u;
}
有解释我看不懂:"....我们要回传到主函数的并非是一个数值,而是一个指针"(难道第二个函数回传存头指针的地址不算回传指针?这样不可以吗)

------解决方案--------------------
"假设sum所指的是0002H.所以*sum对0002H中的值进行了修改为33,当回到主函数时,取*c的值读出了33,这也就达到了参数回传的目的,让sum函数中做的操作反应到了主函数,所以说这是一个传值过程????

参数是 int *,
实参传递的是c(假设值是002h,这个是一个地址值), 也是 int *, 是一个地址值。

在 add 函数中,
通过 *sum 操作 sum 这个指针指向的地址的值,
也就是让 002h 这个内存地址中的值赋值为 aa+bb。
这样,它通过 int *的解引用,操作了这个指针指向的内存空间的内容,
那么在对实参c解引用 *c=*002h=aa+bb
这样就把操作结果反馈给主调过程了。
------解决方案--------------------
1. 函数行参指针指向的地址内的内容被修改,将会修改主调函数中的实参指针所指向的地址内的内容。

2. 函数行参指针指向的地址被修改,不会修改主调函数的实参指针所指向的地址。
------解决方案--------------------
楼主你可以这样去理解,
把调用处的实参赋值给函数里的形参,一看便容易理解


void add(int aa, int bb, int *sum) //相当于sum=c
{
*sum=aa+bb;
}
main()
{
int a,b,*c;
a=12;
b=21;
c=(int*)malloc(sizeof(int));
*c=0;
add(a,b,c);
printf( "a+b=%d ",*c);
}

那么,sum=c,也就是说,sum指向了c所指向的那块内存,即sum和c指向了一个地方
现在在add函数里执行*sum=aa+bb,也就相当于*c=aa+bb,也就是改变了c所指向的那块内存的值。

而如果这时,楼主对sum这样处理:
sum=new int(5),那么现在sum指向了一块新的内存,它的值是5,而c并没有改变,也就是说,现在sum和c指向的两块不同的内存了


所以现在可以说是,第一种情况是所谓的按地址传递(c所指向的那块地址)起到的效果,第二种情况是按值传递(c这个指针)起到的效果


------解决方案--------------------
下面内容重要,概念弄清楚!
传指针也是传值,比如:
void fun(int* pInt);

int m = 5;
fun(&m);

如果m的地址是0x0005,那么调用fun函数的时候会把0x0005这个值copy一份然后压栈, 由于在fun函数内都是通过*pInt访问,所以是直接操作的0x0005里面存放的内容.

因此对于5来说, 传的是地址, 对于m来说传的则是值. 实际上指针也是一种类型, 就是一个整数而已,因此在传递过程中和fun(int m)没有任何区别.

以上文字不长,说通即可.