我有一个练习,告诉我只使用指针将元素输入到数组中。所以我在WEB(https://codeforwin.org/2017/11/c-program-input-print-array-elements-using-pointers.html)
#include <stdio.h>
#define MAX_SIZE 100 // Maximum array size
int main()
{
int arr[MAX_SIZE];
int N, i;
int * ptr = arr; // Pointer to arr[0]
printf("Enter size of array: ");
scanf("%d", &N);
printf("Enter elements in array:n");
for (i = 0; i < N; i++)
{
scanf("%d", ptr);
// Move pointer to next array element
ptr++;
}
// Make sure that pointer again points back to first array element
ptr = arr;
printf("Array elements: ");
for (i = 0; i < N; i++)
{
// Print value pointed by the pointer
printf("%d, ", *ptr);
// Move pointer to next array element
ptr++;
}
return 0;
}
我无法理解这条特定的线路:
for (i = 0; i < N; i++)
{
scanf("%d", ptr);
// Move pointer to next array element
ptr++;
}
为什么我们使用ptr
而不使用(*ptr
(取消引用它。CCD_ 3是从CCD_。当我们使用scanf
时,我们键入的是值(int、double或float(,而不是地址,那么为什么指针没有*
呢?
谢谢。
为什么我们使用ptr而不使用(*ptr(取消引用它。
我们将向scanf
传递指向内存的指针,在该指针上写入从键盘获得的int。取消引用就是自己跟随指针,这对scanf知道在哪里写入值没有帮助。
当我们使用scanf时,我们键入的是一个值(int、double或float(,而不是地址,那么为什么ptr没有*呢?
&N
中的&
是运算符的地址,意思是";使我成为指向N"的指针;。你可以先写int *N_ptr = &N;
,然后再写scanf("%d", N_ptr);
,如果这样更清楚的话。
还有一件事:在C中传递参数是通过复制完成的。含义:
void some_function(int i) {
printf("%pn", &i);
}
int main(void) {
int i;
printf("%pn", &i);
some_function(i);
}
这样可以保证打印出两个不同的指针值。内存中必须有两个int
,因为如果some_function
修改i
,则不会修改调用者中的i
。这就是为什么scanf
不能只使用自己的地址来获得原始地址:它只会获得它收到的副本的地址,并且在调用方读取之前副本已经不见了