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 = 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);
}