看看吧,就是这样奇怪的 C 呀

ableyoyo 2005-08-07 10:22:44
main ( )
{
void test ( int *p );
int *p;
test ( p );
printf ( "%d,%d\n" , *p , p );
test ( p );
printf ( "%d,%d\n" , *p , p );
}

void test ( int *p )
{
static int a = 9987;
a = a + 1;
p = &a;
printf ( "%d,%d\n" , a , &a );
printf ( "%d,%d\n" , *p , p );
}

明明有p = &a;但为什么输出结果怎么奇怪
...全文
376 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
snowbirdfly 2005-08-12
  • 打赏
  • 举报
回复
学习~~~
megaboy 2005-08-12
  • 打赏
  • 举报
回复
虽然纯C没有明确地提出名字空间这个概念,但它是实实在在存在的。一个明显的例子是:结构、联合和位字段的标记、变量等跟普通自动变量、函数、常量等可以使用相同的标识符名称,就是因为名字空间不同这个原因。
ableyoyo 2005-08-12
  • 打赏
  • 举报
回复
还没有看到过C中有名字空间的说法,C++中是有的
其实是main的指针变量p的地址与test的指针变量p的地址不同,所以就此p非彼p。
谢谢大家了
ableyoyo 2005-08-12
  • 打赏
  • 举报
回复
虽然纯C没有明确地提出名字空间这个概念,但它是实实在在存在的。一个明显的例子是:结构、联合和位字段的标记、变量等跟普通自动变量、函数、常量等可以使用相同的标识符名称,就是因为名字空间不同这个原因。


有道理。经你一说明白了许多
alrcool 2005-08-12
  • 打赏
  • 举报
回复
不錯﹐﹐有長進了。。。。
hejiwangbaggio 2005-08-12
  • 打赏
  • 举报
回复
megaboy(想忘记,却更是不能忘记!)
说的很正确,形式参数肯定和实参是不同的两个变量,只不过是实参会把其值传给形式参数而已!
道理和直接传值是一样的,传递指针变量是同样要遵循这个原理!
megaboy 2005-08-11
  • 打赏
  • 举报
回复
这不是限制,而是彼此所处的名字空间不同,此p非彼p。
ableyoyo 2005-08-11
  • 打赏
  • 举报
回复
jixingzhong(瞌睡虫(既然选择了远方,那就只有风雨兼程了!!))

说对了的,但是我觉得为什么会有这个限制呢?

道理上说不过去呀

请大家积极回答,谢谢了
K 2005-08-08
  • 打赏
  • 举报
回复

main ( )
{
void test ( int *p );
int *p=new int;
test (p);
printf ( "%d,%d\n" , *p , p );
test ( p );
printf ( "%d,%d\n" , *p , p );
}

void test ( int *p )
{
static int a = 9987;
a = a + 1;
*p = a;
printf ( "%d,%d\n" , a , &a );
printf ( "%d,%d\n" , *p , p );
}

Goldrush 2005-08-08
  • 打赏
  • 举报
回复
指针很烦人啊
PMsg 2005-08-08
  • 打赏
  • 举报
回复
&a是地址 你把直接&a赋给p当然不对啊
test(&p);
.....
.....
.....
*p=&a ;
ksksks 2005-08-08
  • 打赏
  • 举报
回复
楼上的改法没有通过阿,用 VC6.0编译会有p没有初始化的问题
就是初始化为null 也不行,因为函数没有改变 p 的值。

我觉得用二级指针不错,

另外我有个问题,不是说 不能在函数内部声明函数的吗?/
为什么在 main()里面可以,
具体什么说法啊?/

fire314159 2005-08-08
  • 打赏
  • 举报
回复
此main的p非彼test的p,就那么简单。
jixingzhong 2005-08-08
  • 打赏
  • 举报
回复
根据上面说的

除了使用 2 级指针以外

还可以这么修改 ...

main ( )
{
void test ( int *p );
int *p;
test ( p );
printf ( "%d,%d\n" , *p , p );
test ( p );
printf ( "%d,%d\n" , *p , p );
}

void test ( int *p )
{
static int a = 9987;
a = a + 1;
*p = a; /*修改的是指针的志向的内容 而不是指针本身!*/
printf ( "%d,%d\n" , a , &a );
printf ( "%d,%d\n" , *p , p );
}


结果和预期的一样!!!
jixingzhong 2005-08-08
  • 打赏
  • 举报
回复
呵呵

楼主的问题和其他很多一样!

这个我已经结实了很多次了..




首先,

1 对于被当做函数参数传递的指针

我们只能是修改指针志向的内容 而不能修改指针本身的!

在你的程序中 p = &a; 指针被修改了 ...


2 如果不的不修改指针的话

可以使用2级以上的指针

(其实使用了 2级以上的指针以后

我们修改一维的指针 就是相当于修改 2级指针 的志向的内容 !!)





其中的原理

可以看看参数传递的过程 ...

呵呵
getter 2005-08-08
  • 打赏
  • 举报
回复
a是局部變量啊,退出了test後,a也隨之釋放...若a是指針的話,那麼以a來申請的空間就不會釋放
leechongqing 2005-08-07
  • 打赏
  • 举报
回复
llf_hust 2005-08-07
  • 打赏
  • 举报
回复
#include<stdio.h>
main ( )
{
void test ( int **p );
int *p;
test ( &p );
printf ( "%d,%d\n" , *p , p );
test ( &p );
printf ( "%d,%d\n" , *p , p );
}

void test ( int **p )
{
static int a = 9987;
a = a + 1;
(*p) = &a;
printf ( "%d,%d\n" , a , &a );
printf ( "%d,%d\n" , **p , (*p) );
}


/*写成这样就可以了 */

69,336

社区成员

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

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