2012-02-15 10 views
0

ポインタを関数に渡すときにポインタで理解できないことがいくつかあります。 の場合は関数の引数としてポインタを渡す意味は何ですか?

void help (const int *p) 

私は機能help内の引数pを変更することができるように関数を宣言しますか? ポインタのポインタも変更できますか?

ご清聴ありがとうございます。

答えて

4

はい、pを変更できます。ただし、発信者は変更されません。 Cは値渡し言語です。 exactly this situationに関する質問があるC FAQをチェックしてください。

+0

まあ、その正確なケースでは、その 'const'が宣言されて以来、あなたはできませんが、一般的には上記のとおりです。 – jka6510

+0

よろしくお願いします。 –

+0

'help 'の中の' p'のコピーを変更できないのはなぜですか?宣言の 'const'は' p'が定数データを指していることを意味するだけで、 '* p = 5'のようなステートメントは許されません。 –

1

この場合、pconst int *と宣言されているため、pの変更はコンパイラによって許可されません。

pが普通の古いint *だった場合は、pが指しているものを変更して、発信者に通知することができます。あなたが書いたと言う:

void foo(void) { 
    int n = 100; 

    help1(&n); 
    printf("n = %d", n); 

    n = 100; 
    help2(&n); 
    printf("n = %d", n); 
} 

void help1(int *p) { 
    *p = 50; 
} 

void help2(int *p) { 
    p = (int *)malloc(sizeof(int)); 
    *p = 50; 
    free(p); 
} 

その後foo()を呼び出すと、あなたのプログラムは、このプログラムでは

n = 50 
n = 100 

を印刷する原因となる、help1pポイントはにその事を変更し、呼び出し側はそれを見ることができます。一方、help2pをメモリ内の別の場所を指すようにし、何かhelp2はメモリ内の他の場所が呼び出し元に見えないように修正します。

1

Cのconst表記を理解する最も簡単な方法は、宣言を大声で言うことです。名前でスタートし、左に行く:

const int *p; // 'p' is a pointer to an int that is const 

これに等しい方法である:

int const *p; 

これはあなたがで何Pポイントを変えることができることを示唆している、しかし、あなたは何でもそれを変更することはできませんを指す。したがって、あなたは読み取り専用アクセス権を持ちます。そして、あなたが望むように、メモリがはるかにあるpによって指さ変更する可能性がありますが、pを変更することができませんでした...

int * const p; // 'p' is a const pointer to an int 

:しかし、あなたはこのようなものを持っていると思います。

+0

私は少し混乱しています。したがって、 "int const * p;"の場合私は* pの値を変更することができますが、私はそれがメモリ内でポイントする場所と "int * const p"の反対側を変更することができます。 –

+0

はい。 'int const * p'/'const int * p'は 'p'は変更できますが、 '* p'は変更できないことを意味します。そして、 'int * const p'の逆です。 –

関連する問題