01数组的下标可以是负数
C语言中使用数组,一般来说都是这样的:
inta[5]={1,2,3,4, 5}; a[0] = 10;语法规定,数组的长度必须是个常量,保证数组所占的内存大小不变。数组下标从 0 开始,依次往后递增。于是大部分同学都把它当作了默认的规则。 其实,数组的长度可以是0,叫做柔性数组,目的是让结构体变成可变长度,可以参考下面的文章: 数组的长度为0会怎样? 第二个,数组的下标也可以是负数,正数表示向后访问,负数表示向前访问。比如:
int a[5] = {1, 2, 3, 4, 5}; int *p = &a[2]; p[-2] = 0;如果不太明白,可以看下下面的图片:
对于二维数组,同样可以使用小于0的下标来访问元素。
intarray[3][3]={{1,2,3},{2,3,4},{3,4,5}}; int(*p)[3]=array+2; printf("%d ",p[-1][-1]);指针p指向数组的第三行,p[-1]表示第二行的首元素地址,p[-1][-1]表示第二行首元素的前面一个元素,即第一行最后一个元素(二维数组在内存中也是连续的)。
使用负数作为下标来访问数组,切记内存不要越界,访问的内存一定是存在的,否则会导致程序奔溃。
02 数组名可以放在括号中
由于数组和指针在使用上是等价的,数组可以使用指针来表示,指针也可以通过下标来访问:
a[i]= 100; *(a+i) = 100; *(i + a) = 100这三行代码的效果是一样的。 所以编译器也支持这样的用法:
i[a] = 100;放在二维数组中就是这样的:
int array[3][3] = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}}; printf("%d ",2[array][2]);倒不是推荐这种写法,笔试题中会出现,认识就行。
03 一个字节保存多个数据
可以使用结构体位域来保存。
struct Test { chara:4; charb:4; };冒号表示位域,即a只占3位(二进制数),b占5位,结构体一共占了一个字节。 对结构体进行初始化:
struct Test t; t.a=1; t.b=3;在内存中的布局是这样的:
如果记录下结构体的地址,直接访问整个字节,得到的结果就是0x31。
struct Test t; t.a=1; t.b=3; char*s=(char*)&t; printf("%x ",*s);
审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
数据
+关注
关注
8文章
7008浏览量
88958 -
内存
+关注
关注
8文章
3020浏览量
74019 -
C语言
+关注
关注
180文章
7604浏览量
136722 -
指针
+关注
关注
1文章
480浏览量
70556 -
数组
+关注
关注
1文章
417浏览量
25940
原文标题:C语言奇技淫巧:数组的下标可以是负数 | 一个字节可以保存多个数据
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
怎么将一个字节数组放在USAT?
我看不到将一个字节数组放在USAT上的功能。我该怎么做?也没有字节的变量类型吗?与PIC32的字节一样,ISUNCORE CHAR?我在网上看过。这似乎不对……所以如果我想在
发表于 10-08 06:39
为什么STM32F107 LWIP发送数据都会丢最后一个字节?
程序目的:MCU接收网络数据并处理后,向网络返回一个数组。问题是:每次返回给网络的数据都会丢失最后一个字节,具体见程序,麻烦各位高手给指点
发表于 10-16 02:41
如何利用单片机向PC发送一个字节数据
//流水灯控制码,该数组被定义为全局变量
/*****************************************************
函数功能:向PC发送一个字节数据
发表于 11-23 15:53
•8036次阅读
浅谈STM32串口通信(一)基本介绍和一个字节传输的实现
文章目录0 传输引脚1 传输一个字节1.1 发送一个字节1.2 接收一个字节2 代码2.1 配置2.2 发送一个字节2.3 接收一个字节0
发表于 12-24 18:51
•14次下载
stm32如何向串口用一个字节发送3300这个数?
stm32如何向串口用一个字节发送3300这个数? STM32是一种嵌入式微控制器,具有高性能,低功耗和低成本等优势。其中,串口通信是嵌入式系统中常用的通讯方式,可以与其他设备或模块进
评论