私はすぐにタイトルに私の混乱を正確に記述する方法を知りません。終了関数の後にポインタが回復するのはなぜですか?
私は以下のCコードの一部があります
#include <stdio.h>
int fun(int arr[]) {
printf("%d %p\n", arr[0], arr);
arr = arr+1;
printf("%d %p\n", arr[0], arr);
}
int main(void) {
int arr[2] = {10, 20};
fun(arr);
printf("%d %p\n", arr[0], arr);
return 0;
}
を出力何であるかを推測?
10 0x7ffe0a638520
20 0x7ffe0a638524
10 0x7ffe0a638520
だから、fun()でアドレスが変わったようですが、機能を終了してから回復しました。
これは、fun()のarrがmain()の実際のarrのコピーにすぎないためですか?
'int fun(int x){x = x + 1; } intメイン(void){int x = 5;楽しい(x); printf( "%d \ n"、x); 0を返します。 } ' - どの出力を生成すると思いますか? –
@OliverCharlesworth十分に公正...私は愚かです。 –
簡単に言うと、 'arr'のベースアドレスは' fun() 'でローカルポインタにコピーされています(関数の引数は便利に初期化されたローカル変数として扱うことができます)。ここでローカル変数のみが変更されます。したがって、出力 –