仅使用指针的输入数组
Input array using only pointers
我有一个练习告诉我只使用指针将元素输入到数组中。
于是在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
) 取消引用它。 ptr
是自 ptr = arr
以来的地址。当我们使用 scanf
时,我们输入的是一个值(int 或 double 或 float)而不是地址,那么为什么没有 *
的指针?
谢谢。
Why do we use ptr without dereferencing it with (*ptr).
我们正在传递 scanf
指向内存的指针,用于写入从键盘获取的 int。取消引用就是我们自己跟随那个指针,这无助于 scanf 知道在哪里写入值。
When we use scanf we type in a value (int or double or float) and not an address so why's that ptr without * ?
&N
中的&
是address-of运算符,意思是“让我成为指向N的指针”。你可以写 int *N_ptr = &N;
然后 scanf("%d", N_ptr);
如果这样更清楚。
还有一件事:在 C 中传递 arguments/parameters 是通过复制完成的。含义:
void some_function(int i) {
printf("%p\n", &i);
}
int main(void) {
int i;
printf("%p\n", &i);
some_function(i);
}
这样可以保证打印出两个不同的指针值。内存中必须有两个 int
,因为如果 some_function
修改了 i
,那不会修改调用者中的 i
。这就是为什么 scanf
不能只使用 address-of 自身来获取原始地址:它只会获取它收到的副本的地址,并且该副本在调用者可以读取它之前就已经消失了。
我有一个练习告诉我只使用指针将元素输入到数组中。 于是在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
) 取消引用它。 ptr
是自 ptr = arr
以来的地址。当我们使用 scanf
时,我们输入的是一个值(int 或 double 或 float)而不是地址,那么为什么没有 *
的指针?
谢谢。
Why do we use ptr without dereferencing it with (*ptr).
我们正在传递 scanf
指向内存的指针,用于写入从键盘获取的 int。取消引用就是我们自己跟随那个指针,这无助于 scanf 知道在哪里写入值。
When we use scanf we type in a value (int or double or float) and not an address so why's that ptr without * ?
&N
中的&
是address-of运算符,意思是“让我成为指向N的指针”。你可以写 int *N_ptr = &N;
然后 scanf("%d", N_ptr);
如果这样更清楚。
还有一件事:在 C 中传递 arguments/parameters 是通过复制完成的。含义:
void some_function(int i) {
printf("%p\n", &i);
}
int main(void) {
int i;
printf("%p\n", &i);
some_function(i);
}
这样可以保证打印出两个不同的指针值。内存中必须有两个 int
,因为如果 some_function
修改了 i
,那不会修改调用者中的 i
。这就是为什么 scanf
不能只使用 address-of 自身来获取原始地址:它只会获取它收到的副本的地址,并且该副本在调用者可以读取它之前就已经消失了。