繁体   English   中英

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

[英]understanding the difference between pointer deference and array indexing

在下面的代码中,有人可以解释为什么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中, a[b]等效于*(a + b)

这导致了有趣的经典

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

上面显示a ,因为*(4 + "foobar")*("foobar" + 4) ,即"foobar"[4]

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

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

因此,这三个陈述

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

是等效的。

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

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

但是sum += ptr[i]没有任何尊重

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

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

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); 在这里,最初将索引值“ i”添加到“ ptr”,然后在取消引用数组指针以获取该值之后。 它被添加到“和”

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM