c指针-函数参数深入探索(请教)

risingsoft 2007-11-27 02:02:54
实在是被C的指针搞糊涂了.以下是代码和不清楚的地方:

---------------------------------源代码--------------------------------------------

main(){
void func1(int);
void func2(int *);
void func3(int*);
int a=10,*p;
int* pp;

printf("\nin main():");
printf("\na=%d,&a=%d,*&a=%d,*(&a)=%d\n",a,&a,*&a,*(&a));
p=&a;
printf("\np=%d,&p=%d,*p=%d\n",p,&p,*p);
pp=a;
printf("\npp=%d,&pp=%d,*pp=%d\n",pp,&pp,*pp);

printf("\nin func1():");
func1(a);
printf("\nin func2():");
func2(p);
printf("\nin func3():");
func3(pp);
}

void func1(int a){
printf("\na=%d,&a=%d,*&a=%d,*(&a)=%d\n",a,&a,*&a,*(&a));
}

void func2(int *p){
printf("\np=%d,&p=%d,*p=%d\n",p,&p,*p);
}

void func3(int* pp){
printf("\npp=%d,&pp=%d,*pp=%d\n",pp,&pp,*pp);
}

---------------------------------执行结果------------------------------------------

in main():
a=10,&a=4048,*&a=26405,*(&a)=10

p=4048,&p=26405,*p=4050

pp=10,&pp=0,*pp=4054

in func1():
a=10,&a=4046,*&a=26405,*(&a)=10

in func2():
p=4048,&p=26405,*p=4044

in func3():
pp=10,&pp=0,*pp=4044

标为红色的字样处是不清楚的地方,这些数据该如何理解与解释?
...全文
243 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
risingsoft 2008-01-04
  • 打赏
  • 举报
回复
问题找出来了,是编译环境有问题.换了个编译器就正常的
risingsoft 2007-11-28
  • 打赏
  • 举报
回复
int* p
int *pp

有什么区别?

risingsoft 2007-11-28
  • 打赏
  • 举报
回复
楼上你的代码在turboc2里执行的结果是这样.

in main():
a=10,&a=4052,*&a=26360,*(&a)=10

p=4052,&p=26360,*p=4054

pp=4052,&pp=26360,*pp=4058

in func1():
a=10,&a=4050,*&a=26360,*(&a)=10

in func2():
p=4052,&p=26360,*p=4048

in func3():
pp=4052,&pp=26360,*pp=4048

只能说明turboc2里的一些运算和VC不同
chlaws 2007-11-28
  • 打赏
  • 举报
回复

/*VC6运行*/
#include<stdio.h>
void main()
{
void func1(int);
void func2(int *);
void func3(int*);
int a=10,*p;
int* pp;

printf("\nin main():");
printf("\na=%d,&a=%d,*&a=%d,*(&a)=%d\n",a,&a,*&a,*(&a));
p=&a;
printf("\np=%d,&p=%d,*p=%d\n",p,&p,*p);
pp=&a; //楼主pp=a这错了
printf("\npp=%d,&pp=%d,*pp=%d\n",pp,&pp,*pp);

printf("\nin func1():");
func1(a);
printf("\nin func2():");
func2(p);
printf("\nin func3():");
func3(pp);
}

void func1(int a)
{
printf("\na=%d,&a=%d,*&a=%d,*(&a)=%d\n",a,&a,*&a,*(&a));
}

void func2(int *p)
{
printf("\np=%d,&p=%d,*p=%d\n",p,&p,*p);
}

void func3(int* pp)
{
printf("\npp=%d,&pp=%d,*pp=%d\n",pp,&pp,*pp);
}
/**************输出结果******************/
in main():
a=10,&a=1245052,*&a=10,*(&a)=10

p=1245052,&p=1245048,*p=10

pp=1245052,&pp=1245044,*pp=10

in func1():
a=10,&a=1244964,*&a=10,*(&a)=10

in func2():
p=1245052,&p=1244964,*p=10

in func3():
pp=1245052,&pp=1244964,*pp=10
chlaws 2007-11-28
  • 打赏
  • 举报
回复
经过我编译测试 事实上*&a也确实=10;
chlaws 2007-11-28
  • 打赏
  • 举报
回复
in main():
a=10,&a=4048,*&a=26405,*(&a)=10

偶个人认为 ,*&a=26405=10;
chlaws 2007-11-28
  • 打赏
  • 举报
回复
给个例子,
int *p ,a;
p=&a//
&*p=a;//&(*p)=&(a)=p;
*&a=a;//*(&a)=*(p)=a
因为*和&运算级别一样,一起出现的时候 结方向是从右向左结合;
chlaws 2007-11-28
  • 打赏
  • 举报
回复
偶给你详细的讲讲
risingsoft 2007-11-28
  • 打赏
  • 举报
回复
谁能帮我解释清楚? 一起讨论也可以...
不能继续迷糊了...
risingsoft 2007-11-28
  • 打赏
  • 举报
回复
本人用的是turboc2英文版编译器.
执行的结果就是这样.

我的语法感觉也没问题吧?
好象有人说我的语法也有问题了,迷糊中...

我是不明白

1.*&a和*(&a)为什么结果相差这么多?既然*和&都是右结合性,那加不加()应该是一个效果,事实却不是?

2.p是指针变量没错,那么&p就是此指针变量的内存地址,*p应该取的是p指向的内容,而这里却不是?

3.&pp=0,说明此指针是空指针,也就是说是一个常量指针,对吗?可是*p为什么还能取到数值?该数值如何理解?

4.各个函数里的迷糊之处与1,2,3相同.形参指针变量与实参指针变量的地址不同,我是理解的.
thecorr 2007-11-28
  • 打赏
  • 举报
回复
晕了啊
mu_yang 2007-11-28
  • 打赏
  • 举报
回复
7楼:
"1.*&a和*(&a)为什么结果相差这么多?既然*和&都是右结合性,那加不加()应该是一个效果,事实却不是? "


我也在turboc2英文版编译器运行了一下
结果和你所说的不一样

理论上 *&a和*(&a) 都表示 a
实际也是

我斗胆问一句,你的程序是否修改过而后没再重新编译



ttlyfast 2007-11-27
  • 打赏
  • 举报
回复
副本论 -_-!
mu_yang 2007-11-27
  • 打赏
  • 举报
回复
in main():
a=10,&a=4048,*&a=26405,*(&a)=10
中的
*&a=26405
的确很让人吃惊

楼主这样改一下看看如何
printf("\na=%d,&a=%p,*&a=%d,*(&a)=%d\n",a,&a,*&a,*(&a));

mu_yang 2007-11-27
  • 打赏
  • 举报
回复
1楼看错了
抱歉
收回
_石头_ 2007-11-27
  • 打赏
  • 举报
回复
*&a=26405
--------------------
搂住什么编译器?
mu_yang 2007-11-27
  • 打赏
  • 举报
回复
"pp=a"
严格的说起来
这句话是错误的
mu_yang 2007-11-27
  • 打赏
  • 举报
回复
第一个
"
in main():
a=10,&a=4048,*&a=26405,*(&a)=10
"
此a非彼a

70,023

社区成员

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

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