关于《c陷阱与缺陷》中数组和指针中先*解引用再&的疑问
《c陷阱与缺陷》第39页:
程序的作用是清空日历里面的数:
include <stdio.h>
int main(){
int calendar[12][31];
int (*monthp)[31];
monthp=calendar;
for(monthp=calendar;monthp<&calendar[12];monthp++){
int *dayp;
for(dayp=*monthp;dayp<&(*monthp)[31];dayp++)
*dayp=0;
}
程序中,&(*monthp)是不是表达的意思就是指针monthp? 因为在&(*monthp)中先使用解引用*取值,然后再使用取地址符&,其作用不就相互抵消了,还是等于monthp这个指针,那为什么要这么多此一举呢?
麻烦大家不腻赐教。。。。。。。。。
[解决办法]
指针的相互转换,monthp是一个指向含有31个元素的数组的指针,dayp是一个整形的指针,因为数组本身可以退化为指针,所以dayp = *monthp的意思就是dayp指向当前数组的第一个元素的地址,(*monthp)[31]指向的是这个数组的第31个元素,再加&取地址,那么就是第31个元素的地址
[解决办法]
1.先明确日历是什么,行列的二维数组。这个程序是假设每个月都是31天,
2.外层for循环控制月份数,也就是12个月为一个循环。内层for循环控制天数,也就是31天为一个循环
3.再来看你提的问题&(*monthp)[31],查询表达式优先级,先执行括号里面的*monthp,表示指向每个月的第一天。再执行(*monthp)[31],表示第31天,然后用&,取地址。
[解决办法]
monthp是指向int类型数组(大小为31)的指针,*monthp就是int类型的数组(int a[31] = *monthp,对&a[31]表示每个月最后一天)
[解决办法]
一般的优先级 是 括号--》后缀--》前缀