C语言中,a[-1] (负数下标)的用途

例子1

我们都知道数组下表是从0开始的,假如我们想从1开始,可以这么干:

定义一个指针,指向a[-1]这个位置

#include <stdio.h>
void main()
{
    int a[] = {1,3,4};
    int *p = &a[-1];
    int i =0;
    for( i = 1; i <4; i++)
    {
        printf("%d
", p[i]);
    }
}

因为数组并不检查下表是否越界,下表仅表示偏移, -1就表示第一个元素前面那个元素

例子2

在 头文件 stdarg.h 中,有如下宏定义:

typedef char* list;

va_arg

#define va_arg(list,mode)   ( (mode *) ( list += sizeof(mode) ) )[-1]

返回可变参数列表的当前指定类型参数,并将指针指向下一参数(mode参数描述了当前参数的类型)

注:list += sizeof(mode) 表示指针 list 指向下一个参数,((mode *) list) 表示把指针 list 强制转换为 mode * 类型,list[-1] 表示取指针 list 当前指向的前一个成员

原文地址:https://www.cnblogs.com/god-of-death/p/14886562.html