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

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

3天内不再提示

数组的下标为什么可以是负数

学益得智能硬件 来源:学益得智能硬件 2024-12-20 11:18 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近有同学发来这样一段代码,并提出一个问题,数组的下标为什么可以是负数?

#include 


int main()
{
    const char *s = "helloworld";
    const char *p = s + 5;


    printf("%c
", p[-2]);


    return 0;
}

关键是这段代码,编译运行都很顺利。

首先需要搞懂下标的作用是什么,准确的说,它是个偏移量。

比如 a[3],数组名 a 作为数组首元素地址,下标 3 表示从这个地址开始向后移动 3 个元素,至于具体是几个字节,得看什么元素。

所以 a[3] 完全等价于 *(a + 3),甚至把代码写成 3[a] 编译器也没意见,表示的都是一个意思。

如果把数组下标写成负数,就表示向前偏移。

a[-1] 就是向前偏移一个元素,很显然,前面这块内存不属于数组,不能这样使用,所以很少见到数组下标是负数的。

但是对于这样精心设计过的代码,保证内存不会越界的情况下,完全没有问题。

s 指向了字符 h,p 指向了字符 w,p[-2] 就是往前数两个元素,所以打印出来的就是 l。

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

    关注

    30

    文章

    4976

    浏览量

    74373
  • 数组
    +关注

    关注

    1

    文章

    420

    浏览量

    27463

原文标题:数组的下标可不可以是负数

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    单片机常用的14个C语言算法分享

    找的数放在x 中,把x与a数组中的元素从头到尾一一进行比较查找。用变量p表示a数组元素下标,p初值为 1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p
    发表于 01-29 06:59

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结

    RT-Thread Vector软件包:嵌入式开发的动态数组容器 | 技术集结
    的头像 发表于 01-25 09:33 5623次阅读
    RT-Thread Vector软件包:嵌入式开发的动态<b class='flag-5'>数组</b>容器 | 技术集结

    C语言选择的几种不同方法介绍

    \'; else if ( queue == 1 ) letter = \'S\'; elseletter = \'U\'; 一种更简洁、更快的方法是使用数组下标获取字符数组的值。如下
    发表于 12-12 07:31

    C语言中除数为0属于什么错误

    0 的错误,以及援引数组元素时下标溢出等。 静态错误又可以分为语法错误和静态语义错误。语法错误指有关语言结构上的错误,如单词拼写错误、表达式中缺少操作数、括号不匹配等。静态语义错误指语言意义上错误,如加法运算的两个错作数一个为
    发表于 12-08 06:38

    scanf函数介绍

    \", a));正确 数组元素可使用的最大下标 int i,a[10]={1}; for(i=1;i<=10;i++) printf(%d\",a); 错误 int
    发表于 12-02 06:07

    数组的初体验

    程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组可以数组理解为大小固定,所放物品为同类的一个购物袋,在该购 物
    发表于 11-25 08:06

    二维数组介绍

    大家不要认为二维数组在内存中就是按行、列这样二维存储的,实际上,不管二维、三维数组… 都是编译器的语法糖。 存储上和一维数组没有本质区别,举个例子: int array[3][3
    发表于 11-25 07:42

    把CW32L010用FLASH模拟EEPROM

    ; u16 FEE_data[5]={100,200,300,400,500}; // eeprom变量数组,通过函数读写。eeprom变量名称→枚举名→数组下标 int main(void
    发表于 11-24 07:40

    请问JTAG仿真器可以通过串口给芯片下载程序吗?

    JTAG仿真器可以通过串口给芯片下载程序吗?如果可以是必须要特定的UART口还是任何的UART口都可以? 另外JTAG仿真器能不能通过串口对芯片进行仿真?
    发表于 11-24 07:07

    数组程序无法运行怎么解决?

    主控是103,程序中定义一个const类型 128k只读数组,放在flash上,程序无法运行,堆栈都初始化不了,在keil编译下正常,在rtthread studio下编译无法运行,求教 是内存管理的问题吗
    发表于 09-15 06:21

    CUBEIDE调试过程中,如何将数组仲的数据拷贝到电脑?

    请问,有什么办法可以在CUBEIDE 调试过程中,将数组的数据拷贝到电脑上去?
    发表于 09-09 07:20

    如何使用闪存来保存 CYBT-343026 中的数组等数据?

    您好,我正在尝试使用 CYBT-343026 构建一块电路板。 我想将数据存储在一个简单的数组中。T 即使断电,数据也应该保留。我可以使用EEPROM,但由于数据非常简单,所以我想使用内部闪存。 有没有办法在内部闪存中存储大约20个字节的数据? 它应该是可读和可写的。
    发表于 06-25 06:33

    ++和--运算时数据在正数时计算是正确的,负数时有时候会溜掉计数,为什么?

    ,稍微快点的时候数值如果是正数时正反转都没问题,计算得到的值也是正确的,但是到了负数区就出现计数不准的情况,感觉像是漏掉计数一样,数值会越来越大。
    发表于 06-23 07:25

    在CCG3PA datasheet上看到LVTTL input, VDDD&lt;2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的?

    我在CCG3PA datasheet上看到LVTTL input, VDDD&lt;2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的? 如果是的话,此时芯片供电来自于VBUS_IN ? VDDD供1.8V吗?
    发表于 06-03 10:01

    二维数组指定条件删除指定行,请教

    数组1的第一列进行条件判断,如果小于20,删除所在行,最终需要得到数组2
    发表于 05-13 08:11