[英]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)
实际的增量取决于指针的类型
如果ptr
为int
,则增量即ptr + 1
将使地址增加4(假设int为4个字节)内存位置,即(如果ptr
为0xFF000005 ptr+1
将为0xFF000009)
如果ptr
为char
,则增量即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.