2017-05-28 8 views
1

私はすぐにタイトルに私の混乱を正確に記述する方法を知りません。終了関数の後にポインタが回復するのはなぜですか?

私は以下の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のコピーにすぎないためですか?

+1

'int fun(int x){x = x + 1; } intメイン(void){int x = 5;楽しい(x); printf( "%d \ n"、x); 0を返します。 } ' - どの出力を生成すると思いますか? –

+0

@OliverCharlesworth十分に公正...私は愚かです。 –

+0

簡単に言うと、 'arr'のベースアドレスは' fun() 'でローカルポインタにコピーされています(関数の引数は便利に初期化されたローカル変数として扱うことができます)。ここでローカル変数のみが変更されます。したがって、出力 –

答えて

2

int arr[]が実際にint* arrと同じであるとします。つまり、arrは最初のパラメータfun()から渡されたポインタの値のコピーです。私はあなたのコードを少し変更して、これをより明確にするつもりです。具体的にはarrの名前をfun()に変更しているので、それはと同じではないことが明らかです。

#include <stdio.h> 
int fun(int* ptr) { 
    printf("%d %p\n", *ptr, ptr); 
    ptr = ptr+1; 
    printf("%d %p\n", *ptr, ptr); 
} 
int main(void) { 
    int arr[2] = {10, 20}; 
    fun(arr); 
    printf("%d %p\n", arr[0], arr); 
    return 0; 
} 

今、あなたはarrptrは完全に独立していることがわかります。 ptrは、arrの最初の要素を指し示すポインタです。値ptrに変更すると、元の値はarrに変更されますが、これは私たちが行っていることではありません。値ptrに変更しており、ptrは元の値ではなくarrのコピーであるため、元の値には変更されません。

私はそれが十分明確であることを望みます。

+0

こんにちはスチュワート、あなたの返信いただきありがとうございます。今分かります。 –

関連する問題