| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1703 人关注过本帖
标题:谭浩强没有讲到的指针中()的妙用
取消只看楼主 加入收藏
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
 问题点数:0 回复次数:5 
谭浩强没有讲到的指针中()的妙用

指针中的()有特殊作用,能把二维数组变成一维数组来处理,不仅(*p)[n]可以,*p[n]可以,就连a[n][n]也不例外, #include <stdio.h> main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[3]; int *q[3];

char e[]="8876578"; char *w="8876578";

char c[3][30]={"abcd dijf","ewuh uh","ejfiejf jiiejrf iejfijf"}; char *b[]={"abcd dijf","ewuh uh","ejfiejf jiiejrf iejfijf"};

p=a;

q[0]=a[0]; q[1]=a[1]; q[2]=a[2];

printf("%o %o %o %o\n",p,p[0],p[1],p[2]); printf("%d %d %d %d %d %d %d %d %d %d\n",p,*p[0],*p[1],*p[2],*(p+0),*(p+1),*(p+2),*(p+3),*(p+4),*(p+5)); printf("%o %d %d\n",*p,p[2][5],p[1][2]); printf("%d %d %d %d %d %d %d %d %d %d %d %d\n",(*p)[0],(*p)[1],(*p)[2],(*p)[3],(*p)[4],(*p)[5],(*p)[6],(*p)[7],(*p)[8],(*p)[9],(*p)[10],(*p)[11]); printf("%d %d %d %d %d %d %d %d %d %d %d %d\n",(*a)[0],(*a)[1],(*a)[2],(*a)[3],(*a)[4],(*a)[5],(*a)[6],(*a)[7],(*a)[8],(*a)[9],(*a)[10],(*a)[11]);

printf("%o %o %o %o\n",q,q[0],q[1],q[2]); printf("%o %d %d %d %d %d %d\n",q,*q[0],*q[1],*q[2],q[1][2],q[1][6],(*q)[10]);

printf("%s %d\n",e,e); printf("%s %d\n",w,w);

printf("%s\n%s\n",c[1],b[1]); getch(); }

[此贴子已经被作者于2005-1-12 22:49:32编辑过]

搜索更多相关主题的帖子: 谭浩强 指针 妙用 
2005-01-12 22:43
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
感谢关注,不过可能两位还不够了解我的意思,
一般教科书上都是定义为下面的样子(列数互相匹配),

int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4];
但有意思的就在于,(*p)后的数可能原先就是可以任意指定的(并不一定要匹配上面的列),可由程序员任意指定N,指定N数,就可以以N个列为一行,这样就可以突破限制,灵活的处理数组.我觉得这正是C灵活精妙的地方,尽管是一个小小的().
(不过,这一点我没在帖中说明)
另外,当用加()来把二维数组(也有可能,三维数组等也是一样可以的,不过我没试过)改为一维数组来处理时, 就不再需要(*p)[n],*q[n],a[n][n]中的n起什么作用了.
C精简精妙!!


[此贴子已经被作者于2005-1-13 13:56:36编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-01-13 13:24
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
随意性?还是灵活性
要看是否造成程序的错误,是,就是随意性,否,就是灵活性和强大

只有加上()后才有额外的新功能,否则,就关闭这个功能.,相当与增加了一个开关和它的新增功能.这是随意性还是功能强大?
你说,这是随意性,能不能举个例子(代码)来说明这个"随意性"造成的程序的错误?

[此贴子已经被作者于2005-1-13 15:46:09编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-01-13 15:45
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
我和KNOCKER斑竹的代码例子已经充分说明了问题,
假设我们有一个三维数组(多多维数组也是一样),我们要显示所有的元素,按照常规,我们就要用三个FOR循环嵌套,但用指针加上()这个特殊的灵活功能,由于把多维数组简化成了一维数组(可谓"化繁为简,一目了然,神来之笔!"),因此只要一个FOR就解决了问题.(当然你也可以不用(),那么就也可以用一般的效率低的方法)
这个你说的"随意性"有什么错?

[此贴子已经被作者于2005-1-13 16:02:50编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-01-13 15:58
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
转换什么类型了呀?
knocker老大,
对三维数组来说,这个a[0][0]本身就是地址呀,再加上&amp;就反而不对了吧
另,数组名就是数组首地址呀,
p=a,就行了呀,为何还要p=a[0], 或p=a[0][0],或p=&amp;[0][0][0]?
p=a应该是既正确又简洁的呀,为什么编译器会警告呢?强制转换了类型?但此处只是合法的赋值给指针变量,转换什么类型了呀?

[此贴子已经被作者于2005-1-13 18:00:18编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-01-13 16:19
grub2linux
Rank: 1
等 级:新手上路
帖 子:335
专家分:0
注 册:2004-12-25
收藏
得分:0 
讨论问题,互相商讨嘛,主要看谁讲的有道理..
不过,我的看法倒是跟老兄相反的,我们做程序(包括一切别的事)的目标恰恰就是要不断追求,努力争取达到随心所欲(当然必须同时达到正确有效,的前提条件)的目标,随意而后为上也...

[此贴子已经被作者于2005-1-13 18:01:36编辑过]



有缘相识!我中文系的 3月拿下C/C++/VC 5天写游戏 2月写游戏系统 有空去http://mykool.go2.
2005-01-13 16:41
快速回复:谭浩强没有讲到的指针中()的妙用
数据加载中...
 
   



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

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