| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1135 人关注过本帖
标题:一个困扰我的指针问题
取消只看楼主 加入收藏
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
 问题点数:0 回复次数:7 
一个困扰我的指针问题

先看问题程序:
#include <stdio.h>
void func1(char *p)
{
p = "4567";
}

void func2(char **pd)
{
*pd = "5678";
}

main()
{
char *ptr = "1234";
func1(ptr);
printf("%s\n", ptr);

char *ptrd = "2345";
func2(&ptrd);
printf("%s\n",ptrd);

return 0;
}
看了程序,估计您也可能也会猜到我要问的问题了,为什么func2可以把指针地址带出来,而func1却不可以。
这里请不要简单的解释说,因为func1结束了,所以p指针的生命期终止被回收。也不要解释说因为编译器有对入参指针有个备份_p的说法。这里,我只是想搞清楚,为什么二级指针可以,而一级指针却不可以。

搜索更多相关主题的帖子: 指针 困扰 
2007-09-26 17:01
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

这里先谢过各位的赐教了


2007-09-26 17:04
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

请细致解释一下,呵呵


2007-09-26 17:51
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

似乎明白一些了,联想到一点以前在学校里老师讲到的值传递和地址传递。

但是能不能结合这2个函数再具体些,深入些。
如果说入参作为一个变量因为函数结束了,那么它的生命周期就到了,被系统收回。那么当入参作为变量地址时(或者说是指针的地址),这个变量地址是如何被保存下来的。它的地址被保留在什么地方呢
这个变量地址是被保存在栈上还是文本区里


2007-09-26 18:40
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分: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";)为何不能带回指针。而二级指针却可以带回来。既然二级指针可以带回来,那么这个地址的内存空间怎样被创建的,内容如何被保存的。


2007-09-27 09:30
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 
再回复9楼,
这里先提出另外一个问题:函数func1的形参p的内存是在栈上创建的吗,如果是的话,那么func1一结束,形参p的内存是否要被收回。

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

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


2007-09-27 09:48
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 
to 远去的列车:
呵呵,先感谢你的积极回复。

我指的利用函数返回值,是指strcpy。因为你调用了strcpy函数。该函数的一种实现如下:
char *strcpy(char *dst,const char *src)
{
assert( if (src != NULL )&& (dst != NULL))
char *p = dst;
while (*p++ = *src++);
return dst;
}

因此我说你利用了函数的返回值带出来的新指针地址。这个指针地址由于是函数的返回值,因此生命周期到程序结束。我写的那段程序反映了这个意思。

另外一点如果入参是建立在栈上的,那么我用栈上指针作为返回值肯定是不对的。可是这个指针是作为函数入参,内存在那里分配现在我仍在疑惑。不过这样程序仍然是正确结果。。

最后一点,我已经说了不要提林锐参数的副本的那个说法,他对二级指针的地方也没有加以说明。呵呵

2007-09-27 10:06
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

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


2007-09-27 12:42
快速回复:一个困扰我的指针问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012652 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved