0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言使用技巧:数组的下标可以是负数|一个字节可以保存多个数据

学益得智能硬件 来源:学益得智能硬 作者:学益得智能硬 2023-01-11 10:32 次阅读

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;
如果不太明白,可以看下下面的图片:

2808c51a-90ca-11ed-bfe3-dac502259ad0.png  

对于二维数组,同样可以使用小于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]表示第二行首元素的前面一个元素,即第一行最后一个元素(二维数组在内存中也是连续的)。

284eaf80-90ca-11ed-bfe3-dac502259ad0.png

使用负数作为下标来访问数组,切记内存不要越界,访问的内存一定是存在的,否则会导致程序奔溃。

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;
在内存中的布局是这样的:

2880698a-90ca-11ed-bfe3-dac502259ad0.png  

如果记录下结构体的地址,直接访问整个字节,得到的结果就是0x31。
struct Test t;
t.a=1;
t.b=3;


char*s=(char*)&t;
printf("%x
",*s);

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6563

    浏览量

    87947
  • 内存
    +关注

    关注

    8

    文章

    2800

    浏览量

    73119
  • C语言
    +关注

    关注

    180

    文章

    7551

    浏览量

    131867
  • 指针
    +关注

    关注

    1

    文章

    475

    浏览量

    70402
  • 数组
    +关注

    关注

    1

    文章

    409

    浏览量

    25688

原文标题:C语言奇技淫巧:数组的下标可以是负数 | 一个字节可以保存多个数据

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    spi读取多个字节的时候该怎么判断UART的上一个字节已经读完了?

    想问下 spi 的 SPI_SpiIsBusBusy() 的这个API在 UART 中怎么实现,读取多个字节的时候该怎么判断 UART 的上一个字节已经读完了?
    发表于 02-02 06:54

    C51编程中如何把两个字节合并成一个字

    本人用51单片机读取DS18B20的温度值回来,读回来两个字节,用个数组分别装高低字节,可是我想把它们合并成
    发表于 08-28 23:45

    labview如何将两个字节数组组成一个字节数组 然后转换成字符串?

    如何将两个字节数组组成一个字节数组 然后转换成字符串?我现在的做法将这两个数组组合之后为什么是二维的,导致后面维度不匹配。
    发表于 01-29 13:15

    C语言二维数组的定义和引用

    今天用二维数组时不知道怎么用了,网上查了下,摘到这里来了。数组只有下标,称为
    发表于 07-12 08:55

    怎么将一个字节数组放在USAT?

    我看不到将一个字节数组放在USAT上的功能。我该怎么做?也没有字节的变量类型吗?与PIC32的字节样,ISUNCORE CHAR?我在网上看过。这似乎不对……所以如果我想在
    发表于 10-08 06:39

    为什么STM32F107 LWIP发送数据都会丢最后一个字节

    程序目的:MCU接收网络数据并处理后,向网络返回个数组。问题是:每次返回给网络的数据都会丢失最后一个字节,具体见程序,麻烦各位高手给指点
    发表于 10-16 02:41

    DSP串口通信握手协议,实现接收多个字节才能发送一个字节

    新人求教不利用fifo,在串口调试助手下显示发送框有多个字节(如8),然后 接收框才能接收一个字节的协议
    发表于 12-05 20:23

    MC9S12XEG128MAA 串口接受里面偶尔会出现第一个字节是上次回复的数据中任意一个字节

    MC9S12XEG128MAA 串口接受里面偶尔会出现第一个字节是上次回复的数据中任意一个字节 在回复完时初始化了数组,没有在发送中启用接
    发表于 09-18 10:50

    数组下标可以负数吗 ?

    数组下标可以负数
    发表于 09-26 06:45

    UART 发送数据丢失最后一个字节

    STM32 UART 发送数据丢失最后一个字节
    发表于 12-04 15:10 0次下载

    如何利用单片机向PC发送一个字节数据

    //流水灯控制码,该数组被定义为全局变量 /***************************************************** 函数功能:向PC发送一个字节数据
    发表于 11-23 15:53 7879次阅读

    浅谈STM32串口通信(一)基本介绍和一个字节传输的实现

    文章目录0 传输引脚1 传输一个字节1.1 发送一个字节1.2 接收一个字节2 代码2.1 配置2.2 发送一个字节2.3 接收一个字节0
    发表于 12-24 18:51 14次下载
    浅谈STM32串口通信(一)基本介绍和<b class='flag-5'>一个字节</b>传输的实现

    UART发送数据丢失最后一个字节

    电子发烧友网站提供《UART发送数据丢失最后一个字节.pdf》资料免费下载
    发表于 08-01 17:57 1次下载
    UART发送<b class='flag-5'>数据</b>丢失最后<b class='flag-5'>一个字节</b>

    stm32如何向串口用一个字节发送3300这个数

    stm32如何向串口用一个字节发送3300这个数? STM32是一种嵌入式微控制器,具有高性能,低功耗和低成本等优势。其中,串口通信是嵌入式系统中常用的通讯方式,可以与其他设备或模块进行数据
    的头像 发表于 10-26 11:31 585次阅读

    c语言数组怎么定义

    : [ ]; 其中, :数组中元素的数据类型,可以是C语言支持的任何数据类型,例如整型、字符型、浮点型等。 :
    的头像 发表于 11-24 10:11 1517次阅读