| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2936 人关注过本帖
标题:初来乍到, 有问题请教
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:7 
这次多了个*号就正确了,结果的确是0,2,3。其实就是专门测试三种参数传递方式的。看来你只(表面上)理解了指针传递,却不了解前面两种传递,而不了解传参的本质,故指针那里的“理解”也是表面的。要讲这问题篇幅比较长,而且我以前也多次谈过,不想重复,你还是看看书吧。

授人以渔,不授人以鱼。
2012-06-30 10:22
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 31楼 TonyDeng
......         

不太理解参数传递.

我理解是把指针是指向变量地址.     而调用Function2 x=1 所以x值会改变啊.     y是指针传递调用Function2后 y=2 用不是*y=2 所以 y的值应该不变啊.      
#include<stdafx.h>
 #include"stdio.h"
 void Function2(int  x,  int&  y,  int*  z)
 {
      x = 1;
      y = 2;
      *z = 3;
      return;
 }
 void main()
 {
    int x=0, y=0,z=0;
    Function2(x,y,&z);
    printf("%d %d %d",x,y,z);
 }
2012-06-30 10:40
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
int&  y, 这个是引用,C++里面的,C里面没有,
所以你的编译程序应该是.cpp后辍的.改成C后辍的时候编译会出现错误.
传值与传引用(指针)不同,传值是拷贝一份值,引用(指针)传递的是变量的地址.

我们都在路上。。。。。
2012-06-30 10:52
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
x是普通形参,y是引用传参,z是指针传参。其实指针传参和普通传参是一样的,都是传递参数的值:把x的值传入Function2(),等于复制一份副本,在Function2()内部也称之为x,这个x无论怎么改,都不会影响外部原先那个x(在复印件上做修改是不会影响原件的);同样,z也是值传递,但这次传递的是z的地址(&z),把地址复印了一份,在main()中z是实值0,但在Function2()中z是main()中z的地址,这里两个z是不同的东西,不过,通过地址可以找到真身,在Function2()中,*z就是main()中的z,所以*z=3就令main()中的z=3。

y是引用传参,直接把main()中y的别名传入Function2(),两处的y是同一个东西,所以在Function2()中对y作修改,都是直接改真身。引用传参比指针传参优越之处,是不用附加*和&这样的特殊符号。在Function2()中,要用*z来指代main()中的z,一旦忘记加*,就出错,但y就是main()中的y,直接多了,也直观得多,不容易错。通过引用得到的名字,只是别名而已,比如Function2(x,y,&z),声明Function2(int x, int& yyy, int* z),在Function2()中,yyy就是main()中的y,无论怎么改,都是同一个对象,但如果是指针,就要多加一个*号,*yyy才是,这样就很容易出错了,基本上,初学者都是死在这种地方。不过,要回避这种错误,也是有办法的,那就是把变量名起好,指针的名字要很清晰地指出是指针,这样看文字就能提醒思维。不习惯起有意义的变量名,这是学生时代学编程最糟糕的坏习惯,很多大陆的编程教材,自己就不注意这点,把学生也教坏。

指针经常把初学者搞晕,就是符号太多,在C++中,建议多用引用,这也是现代高级语言的共同点,不要死守C的指针,本质上虽然是一样的,但表现形式不同,使用的体验也不一样。

[ 本帖最后由 TonyDeng 于 2012-6-30 11:38 编辑 ]

授人以渔,不授人以鱼。
2012-06-30 11:03
hfhf2006
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:62
专家分:169
注 册:2012-6-29
收藏
得分:0 
呵呵,你的把概念没搞清楚
void *p=malloc(10)   
1、10是指p所指向的普通类型变量的长度应该为10个字节
2、p本身是指针,所有的指针都是用来存放一个地址的(即真实的物理内存地址),其大小事固定,32位为4个字节
ok
                       
2012-06-30 11:27
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 34楼 TonyDeng
Very Good!
Thanks.
2012-06-30 14:48
wangchengbin
Rank: 1
等 级:新手上路
帖 子:44
专家分:0
注 册:2012-6-27
收藏
得分:0 
回复 34楼 TonyDeng
Tony deng,
以下问题我不明白. 为什么sizeof(A)的值是12 ?   而我的理解是结构体A中int a  占4个字节  int*  占4个字节  char  c 占1个字节. 总共9个字节啊! 怎么会是12
而公用体它往往取最大的值.所以是4.这个我能理解.
在32位操作系统中A占________字节,B占________字节
#include<stdafx.h>
#include"stdio.h"
void  main()
{
   struct A{
        int  a;
        int*  b;
        char  c;
           };
union B
      {
        int  a;
        char  b;
        char*  c;
      };
printf("%d\n%d\n",sizeof(A),sizeof(B));
}
2012-06-30 15:01
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
知识点:字节对齐

总有那身价贱的人给作业贴回复完整的代码
2012-06-30 15:11
Cheng_A_S
Rank: 2
等 级:论坛游民
帖 子:9
专家分:17
注 册:2012-6-30
收藏
得分:0 
(1)对于p求sizeof可定时4,因为p时指针(实际是无符号整形)
(2)对于i和j它们是unsigned类型的,做减法运算会将-1强制转换为unsigned类型,-1实际上与1不同就在于符号位一个是1一个是0(2进制),那么将-1转化unsigned然后按照八进制格式打印.
2012-06-30 16:51
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 37楼 wangchengbin
是的,字节对齐的原因。顺便说一下:写程序不要看具体的数字,即不要硬编码sizeof(A)是多少,也不要想像它是多少,直接用sizeof(A)这一块东西,它其实就是常数,你管它具体是多少干嘛。字节对齐,不是所以机器都有的,给你解释在x86上有字节对齐,不表示在所有机器上都是这样,也未必是这样对齐,有的编译器和运行环境,甚至会把struct中的数据顺序打乱优化过。总之,不要做无谓的假设。

授人以渔,不授人以鱼。
2012-06-30 17:30
快速回复:初来乍到, 有问题请教
数据加载中...
 
   



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

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