これはばかげた質問のように聞こえるかもしれませんが、私はまだ C を学んでいるので、ご容赦ください。:)
私は K&R (構造体) の第 6 章に取り組んでおり、これまでのところ、この本は大きな成功を収めています。私は構造体をかなり扱うことに決めたので、この章の早い段階で point と rect の例を使って多くの作業を行いました。私が試したかったことの 1 つは、canonrect
ポインターを介して関数 (第 2 版、p 131) の動作を変更することvoid
でした。
私はこれを機能させていますが、皆さんが私を助けてくれることを望んでいた問題に遭遇しました。canonRect
一時的な四角形オブジェクトを作成し、その変更を実行してから、渡されたポインターを一時的な四角形に再割り当てして、コードを簡素化したいと考えていました。
しかし、そうすると、rectは変わりません。代わりに、渡された rect のフィールドを手動で再設定していることに気付きますが、これはうまくいきます。
コードは次のとおりです。
#include <stdio.h>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) > (b) ? (a) : (b))
struct point {
int x;
int y;
};
struct rect {
struct point lowerLeft;
struct point upperRight;
};
// canonicalize coordinates of rectangle
void canonRect(struct rect *r);
int main(void) {
struct point p1, p2;
struct rect r;
p1.x = 10;
p1.y = 10;
p2.x = 20;
p2.y = 40;
r.lowerLeft = p2; // note that I'm inverting my points intentionally
r.upperRight = p1;
printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n",
r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);
// can't pass a pointer, only a reference.
// (Passing pointers results in illegal indirection compile time errors)
canonRect(&r);
printf("Rectangle, lower left: %d, %d; upper right: %d %d\n\n",
r.lowerLeft.x, r.lowerLeft.y, r.upperRight.x, r.upperRight.y);
}
void canonRect(struct rect *r) {
struct rect temp;
temp.lowerLeft.x = min(r->lowerLeft.x, r->upperRight.x);
temp.lowerLeft.y = min(r->lowerLeft.y, r->upperRight.y);
temp.upperRight.x = max(r->lowerLeft.x, r->upperRight.x);
temp.upperRight.y = max(r->lowerLeft.y, r->upperRight.y);
r = &temp; // doesn't work; my passed-in rect remains the same
// I wind up doing the following instead, to reassign all
// the members of my passed-in rect
//r->lowerLeft = temp.lowerLeft;
//r->upperRight = temp.upperRight;
}
だからここに質問があります:
- なぜ機能し
r = &temp;
ないのですか?(これは、ポインターではなく参照を渡すためだと思います。参照は変更可能ではなく、ポインターは変更可能であると考えるのは正しいですか?) - へのポインターを渡そうとすると、不正なインダイレクションのコンパイル時エラーが発生するのはなぜ
canonRect
ですか? (IE、私が持っていcanonRect(*r);
た場合main()
。)
1. の答えはすでにわかっていると思いますが、2. は私を困惑させます。ポインターを渡すことは合法だと思っていました。
とにかく... Cの初心者を許してください。