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.总结
对于非常用的写法,需要了解,但建议还是坚持通俗易懂的语句,提高程序可读性。