ポインタを関数に渡すときにポインタで理解できないことがいくつかあります。 の場合は関数の引数としてポインタを渡す意味は何ですか?
void help (const int *p)
私は機能help
内の引数p
を変更することができるように関数を宣言しますか? ポインタのポインタも変更できますか?
ご清聴ありがとうございます。
ポインタを関数に渡すときにポインタで理解できないことがいくつかあります。 の場合は関数の引数としてポインタを渡す意味は何ですか?
void help (const int *p)
私は機能help
内の引数p
を変更することができるように関数を宣言しますか? ポインタのポインタも変更できますか?
ご清聴ありがとうございます。
はい、p
を変更できます。ただし、発信者は変更されません。 Cは値渡し言語です。 exactly this situationに関する質問があるC FAQをチェックしてください。
この場合、p
はconst 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
を印刷する原因となる、help1
はp
ポイントはにその事を変更し、呼び出し側はそれを見ることができます。一方、help2
はp
をメモリ内の別の場所を指すようにし、何かhelp2
はメモリ内の他の場所が呼び出し元に見えないように修正します。
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
:しかし、あなたはこのようなものを持っていると思います。
私は少し混乱しています。したがって、 "int const * p;"の場合私は* pの値を変更することができますが、私はそれがメモリ内でポイントする場所と "int * const p"の反対側を変更することができます。 –
はい。 'int const * p'/'const int * p'は 'p'は変更できますが、 '* p'は変更できないことを意味します。そして、 'int * const p'の逆です。 –
まあ、その正確なケースでは、その 'const'が宣言されて以来、あなたはできませんが、一般的には上記のとおりです。 – jka6510
よろしくお願いします。 –
'help 'の中の' p'のコピーを変更できないのはなぜですか?宣言の 'const'は' p'が定数データを指していることを意味するだけで、 '* p = 5'のようなステートメントは許されません。 –