您能解释一下为什么p [-1]可能吗?

时间:2018-11-23 15:13:52

标签: c

int *p[10]={5,663,36,6};

 *(p - 1) = 'e';

int c=*(p-1);

printf("%c",c);

我不明白为什么我们在数组索引中使用负数

*(p - 1) = 'e';

3 个答案:

答案 0 :(得分:3)

对于您的示例,这是不确定的行为,但是在某些情况下,您可能需要使用它,特别是如果您的指针指向数组内部的某个位置并且您检查自己是否仍在数组的边界之内。 / p>

就像在这个例子中一样...

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
    char hello[]="worlld";
    char *p;

    for(p=hello;*p!='\0';p++) {
        if ((p>hello) && (p[-1]==p[0])) {
            printf("%c\n",p[0]);
        }
    }
    return(0);
}

答案 1 :(得分:2)

该语言不会阻止您在对数组或指针进行索引时使用负数。这并不意味着它总是正确的。即在您的示例中,它将访问数组元素,该元素位于数组开始位置之前。换句话说,您访问无效的内存地址。

但是在以下情况下,其中p1指向数组的非0元素,则可以使用负索引:

int p[] = {1,2,3,4};
int *p1 = &p[1];

int x = *(p1-1);
int y = p1[-1]; // equivalent to the previous one

在两种情况下,“ x”和“ y”都将变为“ 1”;

答案 2 :(得分:0)

  

我不明白为什么我们在数组索引中使用负数

那是因为

  1. 您显然认为[]是数组运算符,但不是。它是一个 pointer 运算符,根据指针算术定义,在一般意义上,它允许从指针中减去整数。

  2. 您似乎对评估示例代码会产生某种特定的行为期望,但是由于对指针p执行算术运算,它表现出未定义的行为不会产生指向p指向[in]的对象(或恰好位于其末尾)的结果。 “未定义”的意思恰恰是它所说的。尽管可能会发出明显的程序故障或错误消息,但是您不能依靠它或任何其他特定行为。在整个程序中。