在这个特定程序中,int i 在 for 循环(在 scanf 和 sum 中)中做了什么?
What does int i do inside of the for loop(in scanf and sum) in this particular program?
scanf
里的i
和sum
里的i
不是没用吗?它没有任何改变,即使我打印 &ptr
它也没有显示内存值有任何差异。
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int *)malloc(n * sizeof(int));
// if memory cannot be allocated
if (ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for (int i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum = sum + *(ptr + i);
}
printf("Sum = %d", sum);
// deallocating the memory
free(ptr);
return 0;
}
'i' 不应该更改指针。它用于访问 PTR 指向的数组的第 i 个元素。没有 I 它会扫描这个数组中的相同元素,第一个元素
'i' 不是无用的值,它用于偏移指针以访问动态数组的正确元素。
和使用
一样
for (int i = 0; i < n; ++i) {
scanf("%d", &ptr[i]);
sum = sum + ptr[i];
}
"What does int i
do inside of the for loop?"
i
用于访问动态分配内存的后续int
对象的指针偏移。
它的工作原理是:
(value of ptr [address of pointed object by ptr] + (i * sizeof(pointed object by ptr)))
.
也许看看 this 堆栈溢出问题。
注意:目的只是取消引用和修改指向的对象,而不是指针本身。 ptr
不会因为这个指针算法而改变。
"It doesn't change anything, even when I print &ptr
it doesn't show me any difference in memory values."
可能它不会显示不同的值,因为您打印指针本身的地址,它不会通过使用指针的偏移量而改变。
我说“可能”是因为我看不出你是如何打印出 ptr
的地址的。也许你甚至有某种未定义的行为。
索引i
在for
中的作用有两个:
- 确保
n
个数字在 sum
中被读取和累积。
- 将每个转换后的数字存储到
ptr
指向的数组中的单独条目中。
鉴于程序的作用,不需要将数字存储到数组中,甚至不需要分配这个数组。
这是一个更简单的版本:
#include <stdio.h>
int main() {
int n, v, sum = 0;
printf("Enter number of elements: ");
if (scanf("%d", &n) != 1)
return 1;
printf("Enter elements: ");
for (int i = 0; i < n; i++) {
if (scanf("%d", &v) != 1) {
printf("input error\n");
break;
}
sum = sum + v;
}
printf("Sum = %d\n", sum);
return 0;
}
如果您不在 sum 和 scanf 中使用 'i',则不会对 sum 产生任何影响,因为它将在动态内存的第一个索引中获取输入并覆盖它。 'i' 有助于将输入存储在动态内存中。
scanf
里的i
和sum
里的i
不是没用吗?它没有任何改变,即使我打印 &ptr
它也没有显示内存值有任何差异。
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, *ptr, sum = 0;
printf("Enter number of elements: ");
scanf("%d", &n);
ptr = (int *)malloc(n * sizeof(int));
// if memory cannot be allocated
if (ptr == NULL) {
printf("Error! memory not allocated.");
exit(0);
}
printf("Enter elements: ");
for (int i = 0; i < n; ++i) {
scanf("%d", ptr + i);
sum = sum + *(ptr + i);
}
printf("Sum = %d", sum);
// deallocating the memory
free(ptr);
return 0;
}
'i' 不应该更改指针。它用于访问 PTR 指向的数组的第 i 个元素。没有 I 它会扫描这个数组中的相同元素,第一个元素
'i' 不是无用的值,它用于偏移指针以访问动态数组的正确元素。
和使用
一样for (int i = 0; i < n; ++i) {
scanf("%d", &ptr[i]);
sum = sum + ptr[i];
}
"What does
int i
do inside of the for loop?"
i
用于访问动态分配内存的后续int
对象的指针偏移。
它的工作原理是:
(value of ptr [address of pointed object by ptr] + (i * sizeof(pointed object by ptr)))
.
也许看看 this 堆栈溢出问题。
注意:目的只是取消引用和修改指向的对象,而不是指针本身。 ptr
不会因为这个指针算法而改变。
"It doesn't change anything, even when I print
&ptr
it doesn't show me any difference in memory values."
可能它不会显示不同的值,因为您打印指针本身的地址,它不会通过使用指针的偏移量而改变。
我说“可能”是因为我看不出你是如何打印出 ptr
的地址的。也许你甚至有某种未定义的行为。
索引i
在for
中的作用有两个:
- 确保
n
个数字在sum
中被读取和累积。 - 将每个转换后的数字存储到
ptr
指向的数组中的单独条目中。
鉴于程序的作用,不需要将数字存储到数组中,甚至不需要分配这个数组。
这是一个更简单的版本:
#include <stdio.h>
int main() {
int n, v, sum = 0;
printf("Enter number of elements: ");
if (scanf("%d", &n) != 1)
return 1;
printf("Enter elements: ");
for (int i = 0; i < n; i++) {
if (scanf("%d", &v) != 1) {
printf("input error\n");
break;
}
sum = sum + v;
}
printf("Sum = %d\n", sum);
return 0;
}
如果您不在 sum 和 scanf 中使用 'i',则不会对 sum 产生任何影响,因为它将在动态内存的第一个索引中获取输入并覆盖它。 'i' 有助于将输入存储在动态内存中。