当然也可以用第二种方法,用指针的指针作传递参数
----------------解决方案--------------------------------------------------------
先回复10楼,你用了strcpy返回了指针p的新地址。我也清楚函数指针可以带回一级指针的地址,
比如我如下修改func1()同样可以达到fun1带回新指针的目的。这和你的代码意思是一样的。
char *func1(char *p)
{
*p = "4567";
return p;
}
int main()
{
char *ptr = "1234";
printf("%s\n",func1(ptr);
return 0;
}
但我这里想问的不是通过函数返回值的方式获得地址。
当入参(char *p;)是一级指针时,函数语句(*p = "4567";)为何不能带回指针。而二级指针却可以带回来。既然二级指针可以带回来,那么这个地址的内存空间怎样被创建的,内容如何被保存的。
----------------解决方案--------------------------------------------------------
楼上的看清楚了
void func1(char *p)
{
strcpy(p,"4567");
}
函数无返回值,意思是改变 p 指向的内存里的内容
你上面举的例子产生了新的指针来存放函数的返回值,有危险哦!
[此贴子已经被作者于2007-9-27 9:47:06编辑过]
----------------解决方案--------------------------------------------------------
再回复9楼,
这里先提出另外一个问题:函数func1的形参p的内存是在栈上创建的吗,如果是的话,那么func1一结束,形参p的内存是否要被收回。
如果按照9楼在func2对二级指针的解释,那么在func1里我同样可以理解为p就相当于ptr.所以赋值后
ptr = "4567",这是使得ptr指向"4567"的首地址,因此函数结束后,ptr所指向
的就是"4567"阿。但结果是指针ptr仍然是"1234"
我想您还是没有说清楚为什么二级指针可以而一级指针不行
----------------解决方案--------------------------------------------------------
当入参(char *p;)是一级指针时,函数语句(*p = "4567";)为何不能带回指针。而二级指针却可以带回来。既然二级指针可以带回来,那么这个地址的内存空间怎样被创建的,内容如何被保存的。
你这个问题在10楼已经解释过了,关于函数里参数的副本,你可以查查资料
----------------解决方案--------------------------------------------------------
to 远去的列车:
呵呵,先感谢你的积极回复。
我指的利用函数返回值,是指strcpy。因为你调用了strcpy函数。该函数的一种实现如下:
char *strcpy(char *dst,const char *src)
{
assert( if (src != NULL )&& (dst != NULL))
char *p = dst;
while (*p++ = *src++);
return dst;
}
因此我说你利用了函数的返回值带出来的新指针地址。这个指针地址由于是函数的返回值,因此生命周期到程序结束。我写的那段程序反映了这个意思。
另外一点如果入参是建立在栈上的,那么我用栈上指针作为返回值肯定是不对的。可是这个指针是作为函数入参,内存在那里分配现在我仍在疑惑。不过这样程序仍然是正确结果。。
最后一点,我已经说了不要提林锐参数的副本的那个说法,他对二级指针的地方也没有加以说明。呵呵
----------------解决方案--------------------------------------------------------
#include <stdio.h>
void change(int a)
{
a = 3;
}
void change1(int *a)
{
*a = 4;
}
int main()
{
int a = 2;
change(a);
printf("%d\n", a);
change1(&a);
printf("%d\n", a);
}
----------------解决方案--------------------------------------------------------
再回复9楼,
这里先提出另外一个问题:函数func1的形参p的内存是在栈上创建的吗,如果是的话,那么func1一结束,形参p的内存是否要被收回。
如果按照9楼在func2对二级指针的解释,那么在func1里我同样可以理解为p就相当于ptr.所以赋值后
ptr = "4567",这是使得ptr指向"4567"的首地址,因此函数结束后,ptr所指向
的就是"4567"阿。但结果是指针ptr仍然是"1234"
我想您还是没有说清楚为什么二级指针可以而一级指针不行
func1()中的形参是一个局部变量,函数结束后,p的内存被释放.
在第一个函数中,只是改变p的值,并没有改变ptr的值,而在第二个函数中,改变的是ptr的值.
----------------解决方案--------------------------------------------------------
感谢neverTheSame的提示,我想我已经明白这个过程到底是怎么回事了
----------------解决方案--------------------------------------------------------