数组和指针是一个非常发人深省的笔试

在上一次笔试中,我遇到了以下问题。

没有人敢说精通C / C ++。

当然,长时间工作后,许多老问题将很容易解决。

因此,该理论非常重要。

老实说,下面的问题是很基本的。

尽管我当时在笔试中猜对了,但是我仍然需要深入研究具体的转换细节。

例如标题:#include< stdio.h> int main(void){char * str [] = {“ ab”,“ cd”,“ ef”,“ gh”, “ ij”,“ kl”}; char * t; t =(str + 4)[-1]; printf(“%s ",t); return 0;}上面程序的输出是什么?程序正确运行的结果如下:当时我看到,数组下标还具有负值吗?到底是怎么回事?让我们更改上面的程序,非常清楚,如下所示:#include< stdio.h& int int main(void){char * str [] = {“ ab”,“ cd” ;;,“ ef”,“ gh”,“ ij”,“ kl”; }; char * t; // t =(str + 4)[-1]; // printf(“%s <,t); t =(str + 4)[0]; printf(" t:%s ",t); return 0;}毫无疑问,这个程序是ij。

看上图即可得到结果,实际上就是这样的转换关系:实际上,编译器系统将数组元素的形式更改为转换为*(a + i)在执行操作之前。

对于一般的数组元素形式:& lt;数组名称& gt; [<下标表达式& gt]]编译器将其转换为:*(<数组名称& lt;数组名称&& (<下标表达式>),其中下标表达式是:下标表达式*扩展因子。

整个表达式的计算结果是存储器地址,并且最终结果是:*< address& gt; ==< amp; lt;与该地址& gt对应的单元的地址的内容。

可以看出,用C语言对数组的处理实际上是转换为指针地址的操作。

因此,上式的转换结果为:t = *(str + 4); t =(str + 4)[-1] ======= t = *(str + 4-1)======& gt; t = *(str + 3);让我们再次看一下:#include< stdio.h& gt; int main(void){char * str [] = {“ ab”,“ cd”,“ ef”,“ gh” ,“ ij”,“ kl”}; char * t; // t =(str + 4)[-1]; // printf(“%s <,t); t = *(str + 4-1); printf(" t:%s " t); return 0;}操作结果:如果更改措辞,例如:#include& lt; stdio.h& gt; int main(void){int b; int a [10] = { 1,2,3,4,5,6,7,8,9,10}; int * p =& a [0]; b =(p + 8)[-4]; printf( b:%d " b);返回0;}您知道答案是什么吗?相同的算法:继续做好工作!!!通过回顾旧知识来学习新知识,注意基础知识,不要遗漏一些细节!过去的二叉树的奇妙数据结构C语言将xxx.bin文件转换为数组。

不要找它。

您想要的C语言的经典示例在这里〜开源STM32产品:无线订购宝使用评估STM32CubeMX + STM32F1系列开发遇到四个问题和解决方案如果您认为这次分享的文章对您有所帮助,请单击[查找]并转发并分享,这也得到了我的支持。

联系方式

AEC-Q200汽车级组件符合汽车工业标准。耐硫厚膜、精密薄膜、电流传感、电阻阵列、MELF电阻等系列产品可用于汽车照明、媒体、电力系统、仪表等领域。

查看详情

在线咨询