| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 491 人关注过本帖, 1 人收藏
标题:这个数组指针(*(sw+1)[0])如何理解??
只看楼主 加入收藏
默默学习
Rank: 4
等 级:业余侠客
帖 子:134
专家分:200
注 册:2010-6-22
结帖率:84.21%
收藏(1)
已结贴  问题点数:20 回复次数:5 
这个数组指针(*(sw+1)[0])如何理解??
#include "stdio.h"
void main()
{
    int w[2][3]={{3,5,2},{1,9,7}};
    int (*sw)[3]=w;
    printf("%d",(*(sw+1)[0]));
}
// 这个地方,我想问下应该怎么样理解呢?
(*(sw+1)[0]),.输出的值为1.
我是这样认为的:
sw数组指针指向 二维数组名首行地址. (sw+1) 应该就是行加1, 这个时候移动到了 {1,9,7}中的 首行w[1][0]的元素地址.
这个时候 *(&w[1][0])[0]处应该怎么样理解? ,若是变址运算符先执行 (&w[1][0])[0]又是啥意思呢,我调试感觉好象是 表示首行的地址.

请懂的教下我。谢谢了!

[ 本帖最后由 默默学习 于 2011-3-10 20:18 编辑 ]
搜索更多相关主题的帖子: 元素 
2011-03-10 20:16
enco
Rank: 1
等 级:新手上路
帖 子:3
专家分:4
注 册:2011-3-10
收藏
得分:3 
int (*sw)[3]=w; //定义了一个含有3个int型元素的数组并将w数组的入口地址赋给了它的入口地址
printf("%d",(*(sw+1)[0])); //sw+1是将sw数组指针向后移动一个sizeof(sw)的位置,指向w[1][0]这个元素的位置,也就是1
2011-03-10 20:34
baobaoisme
Rank: 7Rank: 7Rank: 7
来 自:AVATAR
等 级:黑侠
帖 子:260
专家分:506
注 册:2010-7-9
收藏
得分:9 
楼主问得好,没这么写过数组,我刚刚在书上查看了下资料,下标运算符[ ]的优先级高于指针运算符*的优先级
*(sw+1)[0],先进行(sw+1)[0]的运算取到地址,然后再取内容
*(sw+1)[0]等价于sw[1][0]等价于*(*(sw+1)+0)
我是这么理解的,不知是否正确

 
2011-03-10 20:57
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:3 
其实就是一个指向长度为3的整形数组的指针
int w[2][3],(*pw)[3];pw=w;
则对w数组元素的非法引用是
A.*(w[0]+2)    B.*(pw+1)[2]
C.pw[0][0]    D.*(pw[1]+2)

如果楼主明白了   看看这道题选什么

                                         
===========深入<----------------->浅出============
2011-03-10 22:04
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
The right-left rule: Start reading the declaration from the innermost parentheses, go right, and then go left. When you encounter parentheses, the direction should be reversed. Once everything in the parentheses has been parsed, jump out of it. Continue till the whole declaration has been parsed.

 
 这段英文的翻译如下:

 右左法则:首先从最里面的圆括号看起,然后往右看,再往左看。每当遇到圆括号时,就应该掉转阅读方向。一旦解析完圆括号里面所有的东西,就跳出圆括号。重复这个过程直到整个声明解析完毕。

          笔者要对这个法则进行一个小小的修正,应该是从未定义的标识符开始阅读,而不是从括号读起,之所以是未定义的标识符,是因为一个声明里面可能有多个标识符,但未定义的标识符只会有一个。

          现在通过一些例子来讨论右左法则的应用,先从最简单的开始,逐步加深:

 int (*func)(int *p);

 首先找到那个未定义的标识符,就是func,它的外面有一对圆括号,而且左边是一个*号,这说明func是一个指针,然后跳出这个圆括号,先看右 边,也是一个圆括号,这说明(*func)是一个函数,而func是一个指向这类函数的指针,就是一个函数指针,这类函数具有int*类型的形参,返回值 类型是 int。

 int (*func)(int *p, int (*f)(int*));

 func被一对括号包含,且左边有一个 *号,说明func是一个指针,跳出括号,右边也有个括号,那么func是一个指向函数的指针,这类函数具有int *和int (*)(int*)这样的形参,返回值为int类型。再来看一看func的形参int (*f)(int*),类似前面的解释,f也是一个函数指针,指向的函数具有int*类型的形参,返回值为int。

 int (*func[5])(int *p);

 func 右边是一个[]运算符,说明func是一个具有5个元素的数组,func的左边有一个*,说明func的元素是指针,要注意这里的*不是修饰func的, 而是修饰func[5]的,原因是[]运算符优先级比*高,func先跟[]结合,因此*修饰的是func[5]。跳出这个括号,看右边,也是一对圆括 号,说明func数组的元素是函数类型的指针,它所指向的函数具有int*类型的形参,返回值类型为int。

 
 int (*(*func)[5])(int *p);

 func 被一个圆括号包含,左边又有一个*,那么func是一个指针,跳出括号,右边是一个[]运算符号,说明func是一个指向数组的指针,现在往左看,左边有 一个*号,说明这个数组的元素是指针,再跳出括号,右边又有一个括号,说明这个数组的元素是指向函数的指针。总结一下,就是:func是一个指向数组的指 针,这个数组的元素是函数指针,这些指针指向具有int*形参,返回值为int类型的函数。

 int (*(*func)(int *p))[5];

 func是一个函数指针,这类函数具有int*类型的形参,返回值是指向数组的指针,所指向的数组的元素是具有5个int元素的数组。

 要注意有些复杂指针声明是非法的,例如:

 int func(void) [5];

 func是一个返回值为具有5个int元素的数组的函数。但C语言的函数返回值不能为数组,这是因为如果允许函数返回值为数组,那么接收这个数组的内容的东西,也必须是一个数组,但C语言的数组名是一个右值,它不能作为左值来接收另一个数组,因此函数返回值不能为数组。

 int func[5](void);

 func是一个具有5个元素的数组,这个数组的元素都是函数。这也是非法的,因为数组的元素除了类型必须一样外,每个元素所占用的内存空间也必须相同,显然函数是无法达到这个要求的,即使函数的类型一样,但函数所占用的空间通常是不相同的。

 作为练习,下面列几个复杂指针声明给读者自己来解析,答案放在第十章里。

 int (*(*func)[5][6])[7][8];

 int (*(*(*func)(int *))[5])(int *);

 int (*(*func[7][8][9])(int*))[5];

          实际当中,需要声明一个复杂指针时,如果把整个声明写成上面所示的形式,对程序可读性是一大损害。应该用typedef来对声明逐层分解,增强可读性,例如对于声明:

 int (*(*func)(int *p))[5];

 可以这样分解:

 typedef   int (*PARA)[5];
 typedef PARA (*func)(int *);

 这样就容易看得多了。

不知道是谁写的了 看了就明白了。。
2011-03-10 22:20
默默学习
Rank: 4
等 级:业余侠客
帖 子:134
专家分:200
注 册:2010-6-22
收藏
得分:0 
看了各位的见解。
我自己是这样理解的.
首先 ( sw + 1 ) 表示行地址加一。作为起始地址开始!
就是 t[0] 且 t 相当于( sw + 1)的地址。
所以 t[0] 取内容 ., *t[0] 就是行地址的控制输出了。
4楼 答案应该是B,.其时是我浏览的时候正好看到这个问题,发现我自己也不是很理解,所以发此帖希望很大家一起讨论一下。
希望LX能继续发表下自己的观点。。
2011-03-10 22:51
快速回复:这个数组指针(*(sw+1)[0])如何理解??
数据加载中...
 
   



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

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