C/C++指针与数组(三)
创始人
2024-06-02 05:21:14
0

指针数组与数组指针和运算符的优先级与结合性

一、指针数组

#include
int main(int argc, char *argv[])
{int a = 3, b = 5, c = 7;int* p[3] = { &a,&b,&c }; //指针数组std::cout << "&a:" << &a << '\n'<< "&b:" << &b << '\n'<< "&c:" << &c << '\n';std::cout << std::endl;for (int i = 0; i < 3; ++i){std::cout << "p[" << i << "]:" << p[i] << '\n';}std::cout << std::endl;for (int i = 0; i < 3; ++i){std::cout << "*p[" << i << "]:" << *p[i] << '\n';}std::cout << std::endl;return 0;
}

在这里插入图片描述

分析:
int* p[3]是一个指针数组:即p是一个数组,这个数组内依次存放指针&a, &b, &c。编译器从右向左去解析,因为运算符[]的优先级高于运算符*,所以p先和[]结合,即p是一个含有三个元素的数组。然后再结合*,意思是这个数组内存放的元素类型是指针。最后再与int结合,它是一个含有三个整型指针的一维数组。

*p[1]:因为运算符[]的优先级高于运算符*,p先和[]结合,所以p[1]取数组中的第一个元素&a,然后再解引用*p[1]即*&a,就取到值3。依照这个思路,同样可以解析出*p[2]、*p[3]。

二、数组指针

#include
int main(int argc, char *argv[])
{int abc[3] = { 1,2,3 };int(*p)[3] = &abc;  //数组指针for (int i = 0; i < 3; ++i){std::cout << "&abc[" << i << "]:" << &abc[i] << '\n';}std::cout << '\n';std::cout << "&abc:" << &abc << '\n'<< "p:" << p << "\n\n";for (int i = 0; i < 3; ++i){std::cout << "*p+" << i << ":" << *p + i << '\n';}std::cout << '\n';for (int i = 0; i < 3; ++i){std::cout << "*(*p+" << i << "):" << *(*p + i) << '\n';}std::cout << '\n';for (int i = 0; i < 3; ++i){std::cout << "**p:" << **p << "\t**p+" << i + 10 << ":" << **p + i + 10 << "\t(**p)+" << i << ":" << (**p) + i << '\n';}std::cout << std::endl;return 0;
}

在这里插入图片描述

分析:
int(*p)[3]:()称为组合(Grouping)运算符,其优先级高于运算符[],所以*先与p结合,说明p是一个指针。再与[3]结合,说明p指向一个数组。最后与int结合,最终结果为p是一个指向含有三个整型元素的一维数组。类似地,可以定义int(*p)[3][3]、int(*p)[3][3][3]等等,它们是指向二维、三维甚至更高维数组的指针。

&abc[0]:因为运算符[]高于&,abc先与[]结合,所以首先得出abc[0]是数组abc首个元素的数值即1。然后再与&结合,最终&abc[0]就是数组abc的首个元素的地址。依照这个思路,同样可解析出&abc[1],&abc[2]。

*p+0:运算符*优先级高于加法运算符+,*先与p结合,即解引用p,然后再与+结合,最终*p和*p+0都指向数组abc中的第一个元素。依照这个思路,同样可解析出*p+1、*p+2。

*(*p+0):组合运算符()优先级高于运算符*,根据上面解析出的结果,即就是对数组abc中的第一个元素的地址解引用,得到1。依照这个思路,同样可解析出*(*p+1)、*(*p+2)。

**p+0、(**p)+0:运算符*优先级高于加法运算符+,加括号(**p)+0并没有改变优先级,因此**p+0取数组中第一个元素的值,从**p+10可得到验证。

三、指针数组指针

int main(int argc, char *argv[])
{int a = 3, b = 5, c = 7;int abc[3] = { 1,2,3 };int* p[3] = { &a,&b,&c }; //指针数组int*(*ptrToArray)[3] = &p; //指针数组指针std::cout << "ptrToArray:" << '\t' << ptrToArray << std::endl;std::cout << "&p:" << "\t\t" << &p << std::endl;return 0;
}

在这里插入图片描述
分析:
int*(*ptrToArray)[3]:尽管运算符[]的优先级高于解引用运算符*,但是组合运算符()高于[],所以ptrToArray先与*结合,即ptrToArray是一个指针。然后再与[3]结合,说明ptrToArray指向一个数组,这个数组内含三个元素。接着与*结合,即这个数组内含三个指针元素。最后与int结合,最终解析出ptrToArray是一个指向内含三个整型指针元素数组的指针。

四、数组指针数组

#include
int main(int argc, char *argv[])
{int abc[2][3] = { 1,2,3,4,5,6 };int(*p[2])[3] = { &abc[0],&abc[1] };  //数组指针数组for (int i = 0; i < 2; ++i){std::cout << "p[" << i << "]:" << p[i] << "\t&abc[" << i << "]:" << &abc[i] << '\n';}std::cout << std::endl;return 0;
}

在这里插入图片描述
分析:
int(*p[2])[3]:因为都在组合运算符()内,并且运算符[]的优先级高于运算符*,p先与[2]结合,说明p是一个内含两个元素的数组。再与*结合,即p是一个内含两个指针元素的数组。由于编译器从右向左解析,再与[3]结合,说明p是一个内含两个指向数组的指针元素的数组,最后再与int结合,最终p是一个内含有两个指向整型数组的指针元素的数组。

五、总结
要注意并且重视运算符优先级与结合性的运用。

参考
《C语言程序设计》(第3版)(谭浩强,清华大学出版社)
《C++程序设计教程》(第3版)(王珊珊,臧洌,张志航,机械工业出版社)
《C++ Primer Plus》(Six Edition)(Stephen Prata)
《C和指针》(Kenneth A. Reek)
广大CSDN社友们的文章

相关内容

热门资讯

wine linux 64位下... 嘿伙计们,今天咱们聊聊在64位Linux上怎么下载Wine,这事儿我可真是兴奋得不得了!你知道吗,W...
dota2反和谐启动项命令-D... 哎呀,各位Dota2的战友们,今天我要爆个猛料,绝对让你玩游戏爽翻天!你是不是也受够了那些和谐版的限...
win7 ultimate x... 说到Win7UltimateX64,心里那个激动啊!这可是咱们的老朋友了,陪伴了多少个日日夜夜的电脑...
汽车电控系统原理与故障分析-汽... 嘿,朋友们,你们有没有遇到过这样的情况:开着车,突然油门反应慢了,或者刹车感觉不对劲?是不是心里一紧...
最新win10正式版版本号-W... 嘿,小伙伴们,你们听说了吗?Win10的最新正式版已经发布了!这次的版本号简直让人眼前一亮,我可是第...
浏览器叠加太烦人?广告、新闻乱... 哎呀,说到这个浏览器叠加啊,我真是一肚子火!你们有没有遇到过这样的情况:正刷着剧呢,突然蹦出来一堆什...
乐度网上购物系统:摆脱实体店烦... 大家好!今天我要给大家“八一八”我最近的购物天堂——乐度网上购物系统!这个平台简直是我的救星,让我摆...
粘贴 您需要权限来执行此操作-... 哎呀,今天真是气死我了!我刚刚在网上看到一段超有趣的话,想复制到我的朋友圈里炫耀一下,结果电脑居然跟...
国产pc based控制器-国... 大家好,我是一个对技术充满热情的工程师,今天我想和大家聊聊我们国产的PCBased控制器,这可是我们...
智汇云家:融合高科技与温馨氛围... 在这个飞速发展的数字时代,我们的生活被各种智能科技深深地影响和改变。而“智汇云家”,这个听起来既现代...
igfxtrayexe应用程序... 哎呀,说到这个igfxtray.exe,我真是头疼得要命!你们有没有遇到过这种情况,就是电脑突然之间...
番茄花园xp原版系统-番茄花园... 嘿,兄弟,还记得那些年我们一起折腾的电脑吗?那时候,谁的手机里没个番茄花园XP原版系统,简直就是落伍...
阿里云 artfull ubu... 大家好,我是一名热衷于探索新技术的科技爱好者。最近,我听说了阿里云上推出了ArtfulUbuntu,...
伟峰oa好还是华天动力oa好?... 哎呀,说到伟峰OA和华天动力OA,这可真是个让人头疼的问题!每次一提起这个,我就感觉自己像是站在十字...
手机省电宝有用吗-手机省电宝真... 嘿,大家好,今天咱们聊聊那个号称能救急的“手机省电宝”,到底是不是真的那么神奇!首先,我得说,这玩意...
2024http://gkcx... 哎呀,说到2024年的高考,我这心情啊,真是五味杂陈!你看,我们这些即将面对高考的孩子们,每天起早贪...
miui哪个版本最省电-MIU... 哎呀,说到MIUI的省电问题,我这心里头可是五味杂陈啊!每次手机电量一掉,我这心情就跟电量一样,直线...
进展性卒中名词解释-记者亲身经... 大家好,我是一名经历过多次医疗现场的记者,今天我要跟大家聊聊一个听起来挺吓人的词——进展性卒中。别急...
维生素b1缺乏神经病-维生素 ... 哎呀,说到这个维生素B1啊,真是让人头疼的小东西!你别看它个头小,一旦它玩起了失踪游戏,我的身体就开...
达思数据恢复收费乱象丛生,消费... 哎呀,说到这个达思数据恢复收费,我真是气不打一处来!你辛辛苦苦存的照片、文件,一不小心全没了,这时候...