C语言数组居然有[-1]下标?

1.背景

  最近在查阅代码(C)时出现类似“a[-1]”的操作,以过往的经验,觉得是非法的访问数组操作,第一反应就是不存在这样的语句,连编译都通不过。实质上,这是完全没问题的语句,编译和执行都是不存在问题,当然也可能与编译器相关。

void fun(char *a)
{
		a++;
		printf("%c\n",a[-1]);
}

2.a[-1]涵义

2.1 案例分析

  “[]”一般用于数组下标访问,而数组下标是从0开始,所以a[-1]的语句一眼看上去比较别扭。对于上面函数,a是函数fun的形参,a为指针(地址),上面函数调用时,打印的就结果应该是传入实参的首地址存放的内容。假如传入字符串str=“ABCD”,则打印结果为“A”。

2.2 涵义

  a[-1]表示区a当前地址相前偏移1个地址内容。当然,前提有效地址范围,如果a指向首地址,则a[-1]会访问越界地址,导致意想不到的后果。因此,a[-1]中的“-1”表示的是地址偏移的意思,即相当于*( a - 1 )同理可以有a[-2]、a[-3]、a[-n]。

2.3 a[+1]
  “[]”也存在正地址偏移量,如a[+1]、a[+2]等,即相对于当前a指向地址向后偏移。例如:

a="ABCDEF";*a = 'A';
则a[+1] = 'B';
a[+2] = 'C';

假如*a=‘C’;
则a[+1] = 'D';
a[+2] = ‘E’;

  从上述可以发现,当a指向首地址(相对)时,a[+1]与常规的数组下标访问a[1]的作用是相同的。

3.总结

  对于非常用的写法,需要了解,但建议还是坚持通俗易懂的语句,提高程序可读性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Acuity.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值