星与酸咪咪

十年树木,百年树袋熊

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  14 Posts :: 15 Stories :: 5 Comments :: 0 Trackbacks

常用链接

留言簿(22)

我参与的团队

最新随笔

搜索

  •  

积分与排名

  • 积分 - 6335
  • 排名 - 1418

最新评论

阅读排行榜

评论排行榜

指针是个麻烦的机制,刚才想到很多,趁没忘赶紧记下来

指针的性质有点类似光的波粒二相性。
它有两种属性,一个说明了变量的地址(绝对的),另一个说明了内存占用的大小,也可以理解为指针的合理变化范围(相对的)。后者不是一定要声明的。当后者没有声明的时候,指针只能指向一个变量,一个类型大小的变量。后者存在的时候,指针就变成了类数组的东西,但是,它比数组要强大。

拿数组和有范围的指针作个对比。数组是有长度的,它必须在编译时确定,指针的长度(在这里我无法用一个准确的词表示上文所说的第二个属性,暂切用住这样的说法)却可以用malloc函数后期确定。而malloc的参数一般用sizeof(类型)*n算出,这个n就类似数组元素的个数,于是实现动态内存管理。对元素逐个操作用指针表示为++p,这里我必须提到指针的第三个属性,个体的大小,也就是所指类型的一个变量的内存大小,这也是之前为什么会出现sizeof(类型)的原因。

为什么说第二个属性是可有可无,而不是和第三个属性是一样的呢?或者说为什么这里要把第二第三个属性区分开来呢?因为如果你这样声明一个字符指针char* a;那么a表示什么呢?它不但可以表示一个字符,也可以表示一个字符串。如果它表示一个字符,则必须(请注意这个必须)令它指向一个字符变量才能使用。如果它是一个字符串,用a=(char*)malloc(sizeof(char)*n);给它长度它就可以表示字符个数为n-1的字符串,而且最重要的是它不用指向某个确定的数组!它自己就是数组了,这里我不想拿指针和数组比,我更想说这时它所表示的和数组表示的一样了!

再来看一个例子,如果声明了一个结构的指针,而且指针有个范围(第二属性存在,存在结构数组),那么++p的意思就是指向下一个结构,结构是自己定义的,感觉上象进化了的数组,这里指针利用了本身第三个属性。然而,在函数参数中,用指针传递一个结构时,这个指针必须指向一个结构!这里的指针又不同于数组了,虽然结构与数组都是数据集合。但是结构更象是真正的把数据打包。毕竟指针默认就是以结构进行跳转,而数组,必须把指针定义到上一级下标。

一口气写下这么多,希望也能对大家有点帮助
如果你有任何想法,请与我探讨
  
 
 评论时间:2007年2月11日 18时50分
我发现一些问题跟上面有些出入。
typedef{double x;double y;}POINT;
POINT* pp;
那么有两种方法使pp可用。
POINT p1;    //第一种
pp=&p1;
这和使用简单的如int变量一样
pp=malloc(sizeof(POINT));    //第二种
就这样就可以用了!这就是刚看到的新问题
仔细看这两种方法的赋值语句,他们的作用是一样的,那就是可以使指针可用,但是目前有两个疑点:一,指针必须至少需要哪些属性才能使用。二,这两种方法赋予了指针哪个属性。
单看我们第一个语句POINT* pp;很明显它明确了第三个属性。
pp=&p1;确定第一属性
pp=malloc(sizeof(POINT)); 确定第二属性
也就是说...第一和第二是可选的,只要具备一个就可以用。除非运算$和函数malloc能算出或返回其他隐含值。

等到发现新的资料,再来与各位探讨
 

2007年2月11日 21时1分
或许,第一第二属性本来就是一个属性...
也就是说,&除了计算地址,也计算了变量大小(大小就是它本身)
而malloc除了计算大小,也赋予了地址(这个几乎是肯定的,malloc本来就是自动分配地址空间的),也就是说malloc是确定了第一第二属性!!原来如此...
pp=&p1;的确不好推断,因为在给定指向以前,它被赋予的是第三属性,直接传到第二属性...对啊!难道&的另一个功能是把第三属性的值直接赋予第二属性!!

指针的三个属性必须都确定了才能使用。声明一个指针确定了第三属性,定义确定了第一,第二属性。
在没找到可疑的源程序前,这是最终结论
posted on 2007-03-05 03:40 0down274 阅读(151) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理