我有一個練習告訴我只使用指標將元素輸入到陣列中。于是在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)而不是地址,那么為什么那個指標沒有 a*
呢?
謝謝你。
uj5u.com熱心網友回復:
為什么我們使用 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("%p\n", &i);
}
int main(void) {
int i;
printf("%p\n", &i);
some_function(i);
}
這保證列印出兩個不同的指標值。int
記憶體中必須有兩個s,因為如果some_function
修改i
,則不會i
在呼叫者中修改。這就是為什么scanf
不能只使用 address-of 本身來獲取原始地址的原因:它只會獲取它收到的副本的地址,并且該副本在呼叫者可以讀取之前就消失了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/392682.html
上一篇:對С 結構的誤解
下一篇:在C中比較int和int*