关于c的指针问题

jody_go 2009-08-28 09:41:23
下面的程序输出结果是多少?为什么呢?

int b = 20;
int c = 30;
int d = 40;

void change_1(int *p)
{
p = &b;
change_2(&p);
}

void change_2(int **p)
{
**p = c;
*p = &d;
}

void change_1(int *p);
void change_2(int **p);

int main()
{
int a = 10;
int *p = &a;

change_1(p);

printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
printf("%d\n", *p);
}
...全文
207 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wissup 2009-09-01
  • 打赏
  • 举报
回复
VC++ 2008 和 Code::Blocks 8.02都试过,会提示change_2重定义的!
疯狂的码字 2009-08-31
  • 打赏
  • 举报
回复
我也是刚学到这,指针和多级指针。。。
确实挺难理解的,这几天我的头都大了。。。
wuda00001 2009-08-31
  • 打赏
  • 举报
回复
10 30 30 10
只是为了理解一些函数调用的问题以及指针指向转换的问题····在进入函数void change_1(int *p1) 后,p1被赋予了b的地址,所以a的值不变 ···调用函数change_2(int **p2) 后p2所指向的地址的值(b)被赋予了c,所以b为30··c的值没有发生改变,仍为30 ···由于printf("%d\n", *p); 这里的p仅针对main()函数的中的p有效,p中仍表示a的地址,故*p为10

pmerOFc 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wissup 的回复:]
首先, 你这个程序这样写根本通不过编译,……[/Quote]
你试过?
什么编译环境?
wissup 2009-08-31
  • 打赏
  • 举报
回复
首先, 你这个程序这样写根本通不过编译,应该如下写,才可以完整的通过编译,要使用,先声明,C语言中的铁律:
void change_1(int *p);
void change_2(int **p);

int b = 20;
int c = 30;
int d = 40;

void change_1(int *p)
{
p = &b;
change_2(&p);
}

void change_2(int **p)
{
**p = c;
*p = &d;
}

int main()
{
int a = 10;
int *p = &a;

change_1(p);

printf("%d\n", a);
printf("%d\n", b);
printf("%d\n", c);
printf("%d\n", *p);
}

其次:C语言中的传递参数,都是传值的,所以每次传参数时,都会自动弄一份拷贝出来。

这样,调用change_1(p)时,实际进入到函数chang_1的是原有的p的一份拷贝,我们暂且记为tp;

然后进入到函数change_1中,实际上就变成tp = b的地址(&b),然后调用chang_2函数,传入的参数是个tp的可以直接地址,实际上就是操作这个tp,而tp又是b的地址。

好,那么就到了函数change_2中啦,**p = c,相当于,*p得到了tp,然后*tp得到b,b = c这样的操作,所以b就变成了c的值就是30.
然后,还是在这个函数中,*p = &d,也就是tp = &d,就是tp更改为d的地址了。

从上述分析来看,a,c *p的内容都没有更改,所以输出为10,30,10,
而b的值被更改为30.

所以输出为:10,30,30,10.
Miracleyb 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wissup 的回复:]
首先, 你这个程序这样写根本通不过编译,应该如下写,才可以完整的通过编译,要使用,先声明,C语言中的铁律:
void change_1(int *p);
void change_2(int **p);

int    b = 20;
int    c = 30;
int    d = 40;

void change_1(int *p)
{
    p = &b;
    change_2(&p);
}

void change_2(int **p)
{
    **p = c;
    *p = &d;
}

int main()
{
    int  a = 10;
    int  *p = &a;

    change_1(p);

    printf("%d\n", a);
    printf("%d\n", b);
    printf("%d\n", c);
    printf("%d\n", *p);
}

其次:C语言中的传递参数,都是传值的,所以每次传参数时,都会自动弄一份拷贝出来。

这样,调用change_1(p)时,实际进入到函数chang_1的是原有的p的一份拷贝,我们暂且记为tp;

然后进入到函数change_1中,实际上就变成tp = b的地址(&b),然后调用chang_2函数,传入的参数是个tp的可以直接地址,实际上就是操作这个tp,而tp又是b的地址。

好,那么就到了函数change_2中啦,**p = c,相当于,*p得到了tp,然后*tp得到b,b = c这样的操作,所以b就变成了c的值就是30.
然后,还是在这个函数中,*p = &d,也就是tp = &d,就是tp更改为d的地址了。

从上述分析来看,a,c *p的内容都没有更改,所以输出为10,30,10,
而b的值被更改为30.

所以输出为:10,30,30,10.
[/Quote]

12楼正解!也可不做函数声明,先定义change_2,再定义change_1也行!
自律则自由 2009-08-30
  • 打赏
  • 举报
回复
4楼讲得很好
sweeneyzang 2009-08-28
  • 打赏
  • 举报
回复
ddddddddddddddddddddd
pmerOFc 2009-08-28
  • 打赏
  • 举报
回复
不好
很烂
jody_go 2009-08-28
  • 打赏
  • 举报
回复
呵呵...
这题对理解c指针很好吗?
pmerOFc 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jody_go 的回复:]
哦,不过就想知道原因啊?能简单的讲讲吗?

[/Quote]
可以
不过我很想知道题目的来源
senr0816 2009-08-28
  • 打赏
  • 举报
回复
10
30
30
10
为了便于理解将函数中的p换为p1,p2
在进入函数void change_1(int *p1) 后,p1被赋予了b的地址,所以a的值不变
void change_2(int **p2) 后p2所指向的地址的值(即b的值)被赋予了c,所以b为30
c的值没有发生改变,所以仍然为30
由于printf("%d\n", *p); 这里的p仅针对main()函数的中的p有效,p中仍存放a的地址,故*p为10
cg05568256068 2009-08-28
  • 打赏
  • 举报
回复
10
30
30
10
指针做函数,只改变其值,其本身函数返回后不变
jody_go 2009-08-28
  • 打赏
  • 举报
回复
哦,不过就想知道原因啊?能简单的讲讲吗?
pmerOFc 2009-08-28
  • 打赏
  • 举报
回复
10
30
30
10
题目那来的?

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧