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

指针中的()有特殊作用,能把二维数组变成一维数组来处理,不仅(*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
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
恩恩,在研究的时候发现过....

淘宝杜琨
2005-01-13 01:16
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

说明一下:


int (*p)[3];


它的意思是:1。p是一个指针,“()”优先原则,所以p是个指针变量

                     2。[3]表示这个指针是指向有三个成员元素的数组

                     3。三个成员是int 型

从上所说,你的程序有点小问题,

你定义为
int a[3][4]
int (*p)[3];


但是却:

p=a;

指针指向了一个非它类型,虽然,某些不太严格编译器能通过(可能会给个警告),但程序容易出错,这里的p,实际应定义为

int (*p)[4];这样才是正确的。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-13 10:29
amzyb
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-1-10
收藏
得分:0 

#include <stdio.h> #include <conio.h> main() { int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; int (*p)[4];//修改了 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(); } //(*p)[4]表示p为一个指针,它指向一个包含4个元素的数组的首地址,你设的二维数组每一行有4个元素,如果是(*p)[3]将不配套! 而(*p)[n] (n>3)等价于(*p)[a][b] a,b满足a*4+(b+1)=n (0<=a<=2,0<=b<=3)

2005-01-13 12:34
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
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
多少维的都一样,这是因为数组在内存都是呈线性排列的

int main()
{
    int a[2][3][4]={{{1,2,3,4},{5,6,7,8},{9,10,11,12}},{{1,2,3,4},{5,6,7,8},{9,10,11,12}}};
    int *p;
    int i;
     p=a[0];/* p=&amp;a[0][0];*//*当然,p=a也行,效果一样,但是会有个警告,这里进行了强制转换*/
    for(i=0;i&lt;24;i++)
    printf("%d\n",*p++);
}

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-13 14:05
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
上面的改一下:
 p=&amp;a[0][0][0];

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-01-13 14:07
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
精妙?我怎么看都像是C语言的缺陷

我还是老老实实的按照书上的规范来写.C语言的随意性我觉得应该规范一下了.

淘宝杜琨
2005-01-13 15:15
天使预备役
Rank: 2
等 级:论坛游民
威 望:3
帖 子:670
专家分:10
注 册:2004-4-6
收藏
得分:0 
这不就是指针数组和数组指针的问题么?
也确实饶的慌!

差点把你忘了...
2005-01-13 15:33
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
快速回复:谭浩强没有讲到的指针中()的妙用
数据加载中...
 
   



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

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