首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >*(arr -1)是否与arr[-1]相同?

*(arr -1)是否与arr[-1]相同?
EN

Stack Overflow用户
提问于 2022-07-04 14:15:14
回答 3查看 113关注 0票数 2

我试图解决这个问题,这个问题有一个向量,有一个指向负指数的指针。我想知道C是否忽略了它,并认为它是一个正数,还是它在向量中倒退,就像-1是数组的最后一个元素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-04 14:29:14

是的,你可以有负索引。这源于C中指针算法的定义,即p[i]*(p + i)完全等价,i是一个负数是完全合法的。

所以,不,这个标志不会被忽略。另外,如果您直接处理一个数组,则没有任何规则规定对数组的末尾进行负索引的计算。如果直接处理数组,则负索引将试图访问数组开头的“左边”内存,这完全违反了规则,导致了未定义的行为。

您可能希望尝试这个说明性的程序:

代码语言:javascript
复制
#include <stdio.h>

int main()
{
    int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int *p = &arr[4];
    int *endp = &arr[8];

    printf("%d %d %d\n", arr[0], arr[4], arr[8]);        /* prints "1 5 9" */
    printf("%d %d %d\n", p[-1], p[0], p[1]);             /* prints "4 5 6" */
    printf("%d %d %d\n", endp[-2], endp[-1], endp[0]);   /* prints "7 8 9" */
    printf("x %d %d x\n", arr[-1], endp[1]);             /* WRONG, undefined */

}

如注释所示,最后一行是错误的。它尝试访问数组arr之外的内存。它会打印“随机”垃圾值,或者理论上它可能崩溃。

票数 5
EN

Stack Overflow用户

发布于 2022-07-04 14:30:49

与arr-1相同?

是。严格地说,订阅[]操作符的数组定义为arr[n]等价于*( (arr) + (n) )。在本例中:*( (arr) + (-1) )

或它在向量中向后移动

好的,它向后走,直到到达数组项0,从那里开始访问超出界限的数组。它不会“环绕”索引或类似的东西。示例:

代码语言:javascript
复制
int arr[3] = ...;

int* ptr=arr+1;
printf("%d\n", ptr[-1]); // ok, prints item 0

int* ptr=arr;
printf("%d\n", ptr[-1]); // not ok, access out-of-bounds.
票数 3
EN

Stack Overflow用户

发布于 2022-07-04 14:56:10

按照C标准(6.5.2.1数组订阅)

2后缀表达式和方括号[]中的表达式是数组对象元素的下标指定。下标运算符[]的定义是E1E2与(*((E1)+(E2))相同)。由于应用于二进制+运算符的转换规则,如果E1是数组对象(等价地,指向数组对象的初始元素的指针),而E2是整数,则E1E2指定E1的第E2元素(从零计数)。

因此,表达式arr[-1]被计算为与*( arr - 1)相同的*( arr + -1 )

但是,请注意,arr[-1]-1[arr]并不相同,因为在方括号之前必须有一个后缀表达式

代码语言:javascript
复制
postfix-expression [ expression ]

一元减号运算符的优先级低于protfix表达式。

但是您可以编写与( -1 )[arr]相同的arr[-1]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72858146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档