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

先看问题程序:
#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
白年不亮
Rank: 1
等 级:新手上路
帖 子:48
专家分:0
注 册:2007-9-17
收藏
得分:0 
指针的概念没搞明白。

[glow=255,red,2] 天凉了,穿上马甲暖和多了。[/glow]
2007-09-26 17:09
万兽无缰
Rank: 1
等 级:新手上路
威 望:1
帖 子:296
专家分:0
注 册:2007-8-27
收藏
得分:0 
又逮到你了,嘿嘿

女朋友问我想怎么死~~~
             我说我想"爽死"
2007-09-26 17:15
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

请细致解释一下,呵呵


2007-09-26 17:51
coachard
Rank: 3Rank: 3
等 级:新手上路
威 望:7
帖 子:1251
专家分:0
注 册:2007-8-12
收藏
得分:0 
指针也是变量,要想改变指针的值,必须用指针的地址,也就是指针的指针。。。

不过这种代码不提倡。

偶学编程,也许本身就是一个错。。。
2007-09-26 18:19
hitzl
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-8-24
收藏
得分:0 

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

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


2007-09-26 18:40
donger68
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-9-26
收藏
得分:0 
偶是新手,确实对这些不是黑明白哈,不好意思哈~~!~~
2007-09-27 00:33
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 

void func1(char *p)
{
p = "4567";/*这里在赋值前,p所指向是main()中的"1234",
当赋值后,p指向的是"4567"的首地址.总之,这里的赋值只是改变p的指向.*/
}

void func2(char **pd)
{
*pd = "5678";/*这里在赋值前,pd指向main()中的ptr(字符指针类型),而*pd就相当于ptr
所以,赋值操作相当于ptr="5678",这是使得ptr指向"5678"的首地址,因此函数结束后,ptr所指向
的就是"5678"*/
}


wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2007-09-27 00:50
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
收藏
得分:0 

编译器为函数的参数准备了一个副本,函数体内改变了副本的内容的同时才改变参数的内容。

在func1里,改变的只是p的副本指向的地址,故p的内容没有被改变。

想要改变可以用这种方法:

[CODE]void func1(char *p)
{
strcpy(p,"4567");
}[/CODE]

这时候又出问题了,因为在main函数里
char *ptr = "1234";
func1(ptr);
ptr指向的是一个常量字符串,内容不能被改变
所以又要改动:
[CODE]int main()
{
char a[] = "1234";
char *ptr = a;
func1(ptr);
printf("%s\n", ptr);
/* ………… */

return 0;
}[/CODE]






C++学习
2007-09-27 08:40
快速回复:一个困扰我的指针问题
数据加载中...
 
   



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

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