2012-11-17 1 views
18

pint *pと宣言した場合、メインモジュールではp=&a;を割り当ててpに含まれるアドレスを変更することができます。ここで、aは既に宣言されている別の整数変数です。 は、私は今、私はアドレスの内容は変更されません関数を使用してポインタに含まれるアドレスを変更する

int main() 
{ 
    int *p; 
    int a=0; 
    p=&a; // this changes the address contained by pointer p 
    printf("\n The address is %u ",p); 
    change_adrs(p); 
    printf("\n the address is %u ",p); // but this doesn't change the address 
    return 0; 
} 

メインモジュールからこの関数を呼び出した場合::

void change_adrs(int*q) 
{ 
    int *newad; 
    q=newad; 
} 

としての機能を使用してアドレスを変更したいです。同じタスクに関数を使用すると何が問題になりますか?

+3

ポインタを値で渡しています。関数内のポインタを変更する必要がある場合は、参照によってポインタを渡します。ダブルポインタ。 –

答えて

23

Cでは、関数の引数は値渡しです。したがって、引数のコピーが作成され、そのコピーに変更が加えられます。実際に参照する予定のポインタは変更されません。ダブルポインタの引数を受け入れるように関数を変更し、逆参照された引数を変更する必要があります。例えば

void foo(int** p) { 
     *p = 0; /* set pointer to null */ 
} 
void foo2(int* p) { 
     p = 0; /* makes copy of p and copy is set to null*/ 
} 

int main() { 
    int* k; 
    foo2(k); /* k unchanged */ 
    foo(&k); /* NOW k == 0 */ 
} 

あなたは、ポインタへの参照を受け入れるように機能を変更することです++別の方法をCを使用しての贅沢を持っている場合。その値によって代わりpを渡す

使用をpのアドレスを渡す機能でqはそれにローカルであるため、

+0

私はC標準が0にpを代入するとnullになることを保証していないことを指摘したいと思います。 – JKT

0

これはpの実際の値を変更しませんし、その機能の変化はmainに反映されません

void change_adrs(int **q) 
    { 
    int * otheraddess; 
    *q = otheraddress; 
    } 

以下この構文とは、あなたが他のWAを持って、このchange_adrs(&p);

のように呼び出しますか、 y around: 関数の戻り値の型を変更し、返されたアドレスをキャッチします。

int* change_adrs(int *q) 
     { 
     int * otheraddess; 
     q = otheraddress; 
     return q; 
     } 


int main() 
{ 
p=change_adrs(p); 
return 0; 
} 
9

Cでは、変数は値渡しされます。ポインタのコピーが関数に渡されます。代わりに、ポインタに別のポインタを使用:

void change(int **p, int *someOtherAddress) 
{ 
    *p = someOtherAddress; 
} 

int a = 1, b = 2; 
int *p = &a; 

printf("*p = %d\n", *p); 
change(&p, &b); 
printf("*p = %d\n", *p); 

これは、intなどのプリミティブデータ型の

*p = 1 
*p = 2 
+0

これは役に立ちました。 –

1

を出力し、二重ポインタは不要です。 intが格納されているアドレスに直接書き込むことができます。アドレスは、呼び出される関数のポインタとして扱われます。これは、ポインタのサイズが可変である配列( "string")のcharとは異なり、呼び出される関数内から変更する際に別のレベルの間接指定を使用する必要があります。これを試してみてください:

void foo(int *oldVal) 
{ 
    int newVal = 99; // or whatever you want 
    *oldVal = newVal; 
} 

int main(int argc, char *argv[]) 
{ 
    int someVal = 0; 
    foo(&someVal);  // we send its address to foo() 

    printf("someVal is now %d.\n", someVal); 

    return EXIT_SUCCESS; 
} 
+0

これは質問に対する応答ではありません!彼はポインタ値ではなくポインタ値の変更を要求します – Phiber

0

あなたがCで関数内の変数の内容を変更したい場合は、ポインタが同様にちょっと変数であり、あなたが使用してポインタまたは間接参照ことによってそれを渡す必要があります常に&番地と*間接参照演算子。私は*演算子は常に使用され、変数の値を変更するときに先行することを意味します。

#include <stdio.h> 
#include <stdlib.h> 


void changeIntVal(int *x) { 
    *x = 5; 
} 

void changePointerAddr(int **q) { 
    int *newad; 
    *q = newad; 
} 

void changePPAddr(int ***q) { 
    int **dummy; 
    *q = dummy; 
} 

int main() { 
    int *p; 
    int **pp; 
    int *tempForPP; 
    int a = 0; 
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 


    p = &a; 
    pp = &tempForPP; 
    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 

    changeIntVal(&a);  // ---- 
          // |--- 
    changePointerAddr(&p); // ---- |----> parts of what I mean 
          // |--- 
    changePPAddr(&pp);  // ---- 

    printf("\n The address pointing by p -> %p, pp -> %p, value of a -> %d ", p, pp, a); 

    return 0; 

} 
関連する問題