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

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


C++学习
2007-09-27 08:41
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
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
收藏
得分:0 
楼上的看清楚了

void func1(char *p)
{
strcpy(p,"4567");
}

函数无返回值,意思是改变 p 指向的内存里的内容

你上面举的例子产生了新的指针来存放函数的返回值,有危险哦!

[此贴子已经被作者于2007-9-27 9:47:06编辑过]


C++学习
2007-09-27 09:43
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
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
收藏
得分:0 
以下是引用hitzl在2007-9-27 9:30:39的发言:

当入参(char *p;)是一级指针时,函数语句(*p = "4567";)为何不能带回指针。而二级指针却可以带回来。既然二级指针可以带回来,那么这个地址的内存空间怎样被创建的,内容如何被保存的。


你这个问题在10楼已经解释过了,关于函数里参数的副本,你可以查查资料


C++学习
2007-09-27 09:50
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
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
收藏
得分:0 

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


C++学习
2007-09-27 10:26
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
以下是引用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的值.


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-27 10:28
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

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


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



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

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