C,C++でのポインタに関する質問です 1. bool f1(int *x , int *y) { 何か } のように関数を設定したとき、呼び出すときは

ベストアンサー

1

1人がナイス!しています

回答ありがとうございます。おかげさまで1に関してははっきりとわかりました。 2に関してはまだ不明点があります。 char buf[256]={0}; とはキャラクタ型の256個のスペースをもつ配列を作り0を入れるという意味ですよね。(0がアドレスたはない)この時点ではbufは単なる配列の名前であり、アドレスを表してるとはいえないですよね?&bufではじめてbufという配列のアドレスを表すような気がします。なぜbufはアドレスだと言えるのでしょうか?少なくとも0は中身のデータですよね? 関数の引数がポインタ型だから配列の名前bufを入れれば勝手にそのアドレスを参照するようになってるのでしょうか?

その他の回答(3件)

0

1. 関数f1の第1引数はint型へのポインタ、第2引数もint型へのポインタと宣言されています。あなたが何をどう思おうと、コンパイラはそれに従って機械語のプログラムを生成します。あなたの「感覚」は微塵も考慮されません。 2. char buf[256]={0}; はただの宣言文です。それにアドレスもなにもありません。当然、ただの宣言文に「データが入る」などということもありません。それはあなたの勘違いです。 さて、コンパイラはこの宣言文に従って ・char型256個分の領域を確保する ・その先頭アドレスをbufというキーワードに紐付けする というふたつの処理を行います。 以降コンパイラはbufというキーワードが出てくるとそれを「紐付けされたアドレス」に置き換えて処理を行います。 このように配列名は「アドレス」に置換される存在ですから、今回の場合のbufは「char型へのポインタ」でもあるわけです。 多くの人が勘違いしていますが、[]は「配列内の要素番号を指定する記号」ではありません。[]は添字演算子といって「ポインタに対して[]内の値から算出したオフセット値を加算して間接参照する演算子」なのです。

1

bool f1(int *x , int *y) ここでの「int *x」は、「xはint型のポインタ」を指しているだけで、「*x」が値を指しているわけではありません。 だから、送る側は、「&x」とアドレスを送り、受け取り側はポインタ変数を用意しているということです。 bool f1(int *x, int *y){     int a = *x;     … } とした場合の2つ目の「*x」は、値を指しています。 int recv_data=read(fd1, buf, sizeof(buf)); この「buf」は、アドレスです。 int recv_data=read(fd1, &buf[0], sizeof(buf)); と同じ意味です。

1人がナイス!しています

1

>bool f1(int *x , int *y) 当面のところは、便宜上、「int型とint*型がある」思い込んでいた方がよいです。つまり、*はxについてるのではなく、intにくっついてint*型という新しい型を形成する、とした方がラクです。

1人がナイス!しています