当前位置: 代码迷 >> C语言 >> 一个困扰我的指针问题
  详细解决方案

一个困扰我的指针问题

热度:91   发布时间:2007-09-27 08:41:30.0

当然也可以用第二种方法,用指针的指针作传递参数


----------------解决方案--------------------------------------------------------

先回复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"

我想您还是没有说清楚为什么二级指针可以而一级指针不行


----------------解决方案--------------------------------------------------------
以下是引用hitzl在2007-9-27 9:30:39的发言:

当入参(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);
}


----------------解决方案--------------------------------------------------------
以下是引用hitzl在2007-9-27 9:48:46的发言:
再回复9楼,
这里先提出另外一个问题:函数func1的形参p的内存是在栈上创建的吗,如果是的话,那么func1一结束,形参p的内存是否要被收回。

如果按照9楼在func2对二级指针的解释,那么在func1里我同样可以理解为p就相当于ptr.所以赋值后
ptr = "4567",这是使得ptr指向"4567"的首地址,因此函数结束后,ptr所指向
的就是"4567"阿。但结果是指针ptr仍然是"1234"

我想您还是没有说清楚为什么二级指针可以而一级指针不行

func1()中的形参是一个局部变量,函数结束后,p的内存被释放.

在第一个函数中,只是改变p的值,并没有改变ptr的值,而在第二个函数中,改变的是ptr的值.


----------------解决方案--------------------------------------------------------

感谢neverTheSame的提示,我想我已经明白这个过程到底是怎么回事了


----------------解决方案--------------------------------------------------------
  相关解决方案