了解指针取消引用和数组索引之间的区别

问题描述 投票:1回答:5

在下面的代码中,有人可以解释为什么sum += *(ptr+i);sum += ptr[i];相同吗?

我知道sum += *(ptr+i);正在取消引用内存地址,然后将数字求和?

但是在sum += ptr[i];中没有尊敬...

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

int main() {
    int len, i, sum;
    printf("Enter how many numbers you want to sum:");
    scanf("%d", &len);
    int* ptr;
    ptr = (int*)malloc(sizeof(int) * len);
    for(i=0; i < len; i++) {
        printf("Enter a number:");
        scanf("%d", ptr+i);
    }
    for(i=0; i < len; i++) {
    //sum += *(ptr+i);
      sum += ptr[i];    
    }
    printf("The sum is %d", sum);
    return 0;
}
c arrays pointers dereference
5个回答
1
投票

完全相同,只是因为这就是语言的工作方式。是的,[]索引运算符确实确实取消了指针向左的引用,它必须这样做才能获取值。

通常在C中,a[b]等于*(a + b)

这会带来有趣的经典之作,例如

printf("%c\n", 4["foobar"]);

以上打印a,因为*(4 + "foobar")*("foobar" + 4)相同,即"foobar"[4]


1
投票

根据定义(C标准,6.5.2.1数组下标)

2后缀表达式,后跟方括号[]是数组对象元素的下标名称。的下标运算符[]的定义是E1 [E2]与(*((E1)+(E2)))。由于适用于二进制+运算符,如果E1是数组对象(相当于一个指针)到数组对象的初始元素),并且E2是整数,E1 [E2]表示E1的第E2个元素(从零开始计数。)

因此这三个陈述

sum += *(ptr+i);
sum += ptr[i];    
sum += i[ptr];    

相等。

考虑到程序具有未定义的行为,因为变量sum尚未初始化。:)为避免溢出,最好像这样声明它:]

long long int sum = 0;
// ...
printf("The sum is %lld\n", sum);

[ptr[i]等于*(ptr + i)实际增量取决于指针的类型

如果ptrint,则增量即ptr + 1将使地址增加4(假设int为4字节)存储位置,即(如果ptr为0xFF000005 ptr+1将为0xFF000009)

如果ptrchar,则增量即ptr + 1将使地址增加1个存储单元(如果ptr为0xFF000005 ptr+1将为0xFF000006)

但是在sum += ptr[i]中没有人尊重

仅在不使用取消引用运算符*的意义上才没有取消引用。但是,取消引用仍然存在,因为C中的索引运算符[]*等效:在所有情况下两者都是可以互换的。当您看到x[i]时,可以将其重写为*(x+i),反之亦然。

[作为索引表达式重写加法的取消引用的能力导致C语法中可读性最低的构造之一-将x[i]重写为i[x]的能力。

[sum += *(ptr+i);这里最初将索引值“ i”添加到“ ptr”,然后在取消引用数组指针以获取该值之后。它被添加到“和”

sum += ptr[i];此处通过数组“ ptr”的索引值“ i”直接访问该值。它被添加到“和”


0
投票

[ptr[i]等于*(ptr + i)实际增量取决于指针的类型


0
投票

但是在sum += ptr[i]中没有人尊重


0
投票

[sum += *(ptr+i);这里最初将索引值“ i”添加到“ ptr”,然后在取消引用数组指针以获取该值之后。它被添加到“和”

© www.soinside.com 2019 - 2024. All rights reserved.