| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9744 人关注过本帖, 1 人收藏
标题:[推荐阅读]C语言的精髓--指针
只看楼主 加入收藏
cdy3166
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2004-12-12
收藏
得分:0 
这个东西是好,可很多书上都有嘛,你应该建议大家到哪本书上去看,毕竟对着电脑看完这么多,还要去消化,确实一件累人的事情.

世上本没有菜鸟,但高手多了,我们就成了菜鸟.
2004-12-29 17:36
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
int (*p)[n]; 书与帖子内容不符?
以下是引用ysfabm在2004-11-20 11:41:41的发言:

int (*p)[n];  p为指向整型二维数组的指针变量,二维数组的列数为n


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2004-12-30 09:53
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
楼主的帖子和书不符..几个疑问?
楼主说
int (*p)[n] 指向二维数组的指针变量,
但谭浩强<C程序设计>说是指向由n个元素组成的一维数组的指针变量.但举的例子,也是用这个指针变量指向一个二维数组的.如下:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
p=a
这两种说法的含义就不一样了,
我理解,这个int (*p)[4]本身只是一个由4个元素组成的一维数组的指针变量,4个元素为(*p)[0],(*p)[1],(*p)[2],(*p)[3].
我试过通过

printf("%o,%o,%o,%o---d%,%d,%d,%d\n",(*p)[0],(*p)[1],(*p)[2],(*p)[3],(*p)[0],(*p)[1],(*p)[2],(*p)[3])
来查看他们是地址还是值,结果显示他们是值(1,2,3,4)
有疑问了:
int *p2=a指 向一个变量的指针变量,p2是地址a,*p2指向1

但上面的int (*p)[4]是指向一个由4个元素组成的一维数组,p是地址a,指针变量指向什么呢?

如果是指向1,2,3,4这四个值,那么",(*p)[0],(*p)[1],(*p)[2],(*p)[3]) 的内容就是地址,但是他们却是值(1,2,3,4),只有p是地址(a), 而且,(*p)[0]的地址和p的地址是完全不一样的(经过测试).那么这些值",(*p)[0],(*p)[1],(*p)[2],(*p)[3]) 的内容存放在了哪里?

另外,上面的(*p)[4]的4不一定是4,可以是其他值,比如3, (*p)[3],那么,他就以一行3列来处理.
由此可见,(*p)[n]不是指向二维数组的,指向由n个元素组成的一维数组的.

[此贴子已经被作者于2004-12-30 10:43:30编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2004-12-30 10:33
ysfabm
Rank: 1
等 级:新手上路
威 望:1
帖 子:274
专家分:0
注 册:2004-11-9
收藏
得分:0 
有了问题,我建议大家先上机试一下,运行出来的结果才是最正确的!

精诚所至,
       金石为开!
      PLM技术社区: [url=http://www.]www.[/url] 最专业的PLM技术讨论社区。
2004-12-30 16:09
冰河2004
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2004-12-22
收藏
得分:0 
我在自学c,可是我学到指针的时候就学不下去了
不知道怎么办呢
贴子好长啊
一回儿看不完
还是先保留下来漫漫研究
我想也不是能够看篇贴就懂了的
我好笨啊
2004-12-30 16:49
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 

#include <stdio.h> main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*p)[4]; int b; p=a; printf("%o,%o,%o,%o,%o,%o,%o,%o\n",p,*p,(*p),**p,&(*p)[0],&(*p)[1],&(*p)[2],&(*p)[3]);

} 问题基本解决了!运行解决表明 p,*p,(*p)和&(*p)[0]这些地址是一样的.


有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2004-12-30 17:18
baby
Rank: 1
等 级:新手上路
帖 子:42
专家分:0
注 册:2004-9-3
收藏
得分:0 
好东东~~收了先~

喝一碗孟婆汤,走一遍奈何桥…………
2004-12-31 11:50
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
收藏
得分:0 
老谭书上说:
二维数组可以理解成一维数组,其每个元素又是一个一维数组。
如:int a[3][4]={1,2,3,4,
                          5,6,7,8,
                         9,10,11,12};
每一行可以看成是数组a一个元素。
数组名是数组的首地址。那么也就是第一个元素的地址,在二维数组中我们可以把它理解成第0行的地址,
那么a + 1是第1行的地址,以此类推。
*a即*(a+0)就是得到数组中第一个元素的值,而数组中每个元素又是一个数组,所以其值是一个地址,是一维数组的首地址,即数组第一个元素的地址,可以认为是元素1 的地址 &amp;a[0][0]。
由此可见:
a,a+1,a+2........都是行的地址。其每加1,都会向下移动一行
*a,*(a+1),*(a+2)分别是第0,1,2行的第一个元素的地址。
*(a + i) + j 即为弟 i 行 弟 j 个元素的地址。

int (*p)[4]   是指向一个一维数组,并且这个数组有4个元素。
用它来处理二维数组,可以指向二维数组的行。

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2004-12-31 12:51
无尘剑
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2005-5-18
收藏
得分:0 
这么多啊,先收了,谢谢楼主。

我只是个菜菜鸟,望各位多多指教!!!!!!!!!!
2005-05-18 20:00
飞翔男孩
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2005-3-18
收藏
得分:0 
被赋值的指针变量前不能再加“*”说明符,如写为*p=&a 也是错误的 那么 main(){ int a=5, *p=&a;-------这又怎么解释?谢谢!!! printf ("%d",*p); }
2005-05-19 09:50
快速回复:[推荐阅读]C语言的精髓--指针
数据加载中...
 
   



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

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