[ptr[i]
等于*(ptr + i)
实际增量取决于指针的类型
在下面的代码中,有人可以解释为什么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个元素(从零开始计数。)
因此这三个陈述
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)
实际增量取决于指针的类型
如果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]
中没有人尊重
仅在不使用取消引用运算符*
的意义上才没有取消引用。但是,取消引用仍然存在,因为C中的索引运算符[]
与*
等效:在所有情况下两者都是可以互换的。当您看到x[i]
时,可以将其重写为*(x+i)
,反之亦然。
[作为索引表达式重写加法的取消引用的能力导致C语法中可读性最低的构造之一-将x[i]
重写为i[x]
的能力。
[sum += *(ptr+i);
这里最初将索引值“ i”添加到“ ptr”,然后在取消引用数组指针以获取该值之后。它被添加到“和”
sum += ptr[i];
此处通过数组“ ptr”的索引值“ i”直接访问该值。它被添加到“和”
[ptr[i]
等于*(ptr + i)
实际增量取决于指针的类型
但是在
sum += ptr[i]
中没有人尊重
[sum += *(ptr+i);
这里最初将索引值“ i”添加到“ ptr”,然后在取消引用数组指针以获取该值之后。它被添加到“和”