最近有同学发来这样一段代码,并提出一个问题,数组的下标为什么可以是负数?
#includeint 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
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
如何使用闪存来保存 CYBT-343026 中的数组等数据?
您好,我正在尝试使用 CYBT-343026 构建一块电路板。
我想将数据存储在一个简单的数组中。T
即使断电,数据也应该保留。我可以使用EEPROM,但由于数据非常简单,所以我想使用内部闪存。
有没有办法在内部闪存中存储大约20个字节的数据?
它应该是可读和可写的。
发表于 06-25 06:33
++和--运算时数据在正数时计算是正确的,负数时有时候会溜掉计数,为什么?
,稍微快点的时候数值如果是正数时正反转都没问题,计算得到的值也是正确的,但是到了负数区就出现计数不准的情况,感觉像是漏掉计数一样,数值会越来越大。
发表于 06-23 07:25
在CCG3PA datasheet上看到LVTTL input, VDDD<2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的?
我在CCG3PA datasheet上看到LVTTL input, VDDD<2.7V,是不是说CCG3PA IO/I2C可以是1.8V电平的?
如果是的话,此时芯片供电来自于VBUS_IN ? VDDD供1.8V吗?
发表于 06-03 10:01
数组的下标为什么可以是负数
评论