C语言中这两个的区别

假如定义一个数组a[3][2]该指针指向数组那么*p[2]和(*p)[2]的区别是什么啊?
定义一个x为一维数组那么++p->x和(++p)->x的区别又是什么呀?!
答案上给的是->的运算优先级比++的优先级高,那就假如在结构体中出现了可以说一下第二个区别吗?谢谢啦

1. 因为*p[2]中,p[2]是指向二维数组a的第三行的指针,再取值就是a[2][0]的值。
(*p)[2]中,p是指向首行数组地址的指针,*p就是二维数组a的首行地址,再取首行第三个值。。。
a[3][2]中没有首行第三个值。。。

2.p->x 和(*p).x等同。如果p指向的是一维数组的话,不能用" . "运算符。错误
如果p指向的是结构体数组的话,结构体内包含x变量的话。
那么这里++p->x的意思是:p指向的结构体内的x变量加1。
(++p)->x的意思是:p指向的结构体的下一个结构体(地址+1)的x变量值。

太绕口了,把自己都说蒙了。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-08-09
.1: *p[2]是指针数组,实质是一个数组,里面的两个元素都是指针
(*p)[2] 是指向一维数组(含两个元素)的指针变量
[]的优先级比*的优先级高,p先与[]结合,形成数组p[2],有两个元素的数组,再与*结合,表示此数组是指针类型的,每个数组元素相当于一个指针变量
2: ++与 ->的优先级相同他们是左结合的 意思就是从左往右运算。++p->x和(++p)->x是一样的因为都是从左往右运算。
对于像这样的类似的表达式你应该要看看c语言的优先级表,希望回答对你有所帮助,祝你好运!
第2个回答  2012-08-09
ha[3][2]十一个2维数组,就好像一个表格,一共有3行,每行两个数据。如下

01 02
11 12
21 23

*p[2]是先算p[2],选中第2行,再算*(p[2]),选中第2行第1个元素。即11
(*p)[2]是先算*p,选中第一行,再算(*p)[2],选中第1行第2个元素。即02

第二个问题无法回答,
->操作符只是在访问结构体或对象成员的时候用。
数组是用不到这个操作符的。
第3个回答  2012-08-09
其实这些只要你知道了操作符的优先级顺序就很号理解了,对于上面的两个问题中涉及的操作符有着样的优先级顺序:()大于 [] 大于 -> 大于 ++ 大于 *,因此:
1.int *p[2]:首先p是个数组(先与[]结合),再由int*说明这个数组的元素为int指针,这是一个整型指针数组;
int (*p)[2]:首先p是个指针,类型为int*,指向一个整型的一维数组,即数组的指针;
2.++p -> x,即是++(p->x),先取p的x成员,再++
(++p)->x是先把p++,后再去取x成员