プロが教えるわが家の防犯対策術!

次のことを実現するC言語のコーディング方法を教えてください。
メイン関数の処理(1)と同等に処理を下位関数subb()で行いたいです。
--- コーディング例 ---
#include <stdio.h>
#include <windows.h>

typedef struct
{
int a;
int b;
} INTT1;
typedef struct
{
INTT1 *inttaP;
INTT1 *inttbP;
} INTTP;

int subb(INTTP inttp[])
{
printf("inttp[0].inttaP->a=%d\n",inttp[0].inttaP->a);
/* ここにメイン関数の処理(1)と同等の処理をしたい ★★★★ */
printf("inttp[0].inttaP->b=%d\n",inttp[0].inttaP->b);
printf("inttp[0].inttbP->a=%d\n",inttp[0].inttbP->a);
printf("inttp[0].inttbP->b=%d\n",inttp[0].inttbP->b);
printf("inttp[1].inttaP->a=%d\n",inttp[1].inttaP->a);
printf("inttp[1].inttaP->b=%d\n",inttp[1].inttaP->b);
printf("inttp[1].inttbP->a=%d\n",inttp[1].inttbP->a);
printf("(*inttp[1].inttbP).b=%d\n",(*inttp[1].inttbP).b);
return 0;
}

int main(int argc, char* argv[])
{

int wk;
int rc;
INTT1 intt1[10];
INTT1 intt2[10];
INTT1 intt3[10];
INTT1 intt4[10];
INTTP inttp[2];

memset(intt1,0x00,sizeof(intt1));
for (wk=0;wk<9;wk++)
{
intt1[wk].a=wk+1;
intt1[wk].b=intt1[wk].a+10;
intt2[wk].a=wk+100;
intt2[wk].b=intt2[wk].a+10;
intt3[wk].a=wk+1000;
intt3[wk].b=intt3[wk].a+10;
intt4[wk].a=wk+10000;
intt4[wk].b=intt4[wk].a+10;
}

inttp[0].inttaP=&intt1[0];
inttp[0].inttbP=&intt2[0];
inttp[1].inttaP=&intt3[0];
inttp[1].inttbP=&intt4[0];

printf("intt1[0].a=%d\n",intt1[0].a);
printf("intt1[1].a=%d\n",intt1[1].a); /* 処理(1) */

rc=subb(&inttp[0]);

return(0);
}

A 回答 (6件)

OK. んで, 「p[1]で,intt1[1]をアクセスできる」と「pは,質問文の『inttp[0].inttaP』」を組合せると


inttp[0].inttaP[1] で intt1[1] をアクセスできる
となる.

これでできるかな?
    • good
    • 1
この回答へのお礼

「inttp[0].inttaP[1].a」で動作させたところ,できました。
ありがとうございました。

お礼日時:2022/01/03 08:55

C の場合ポインタと配列は「違うもの」だけど「関係はある」ので, その


ポインタと配列との関係性
を軸として考えるとわかりやすいんじゃないかなぁ... というか, 配列を式の中で直接扱うケースって実は珍しく (そしてその多くは間違っている), ほとんどの場合で「ポインタを経由」してる.

逆にいえば「配列が使えればポインタはそんなに注力しなくてもいいはず」なんだ, 書き方が「ダサくなる」可能性を除けば.

あと p は &inttp[0] 「ではない」. 「p = &intt1[0];」の右辺にある「&intt1[0]」って, 質問文のどこにある?
    • good
    • 0
この回答へのお礼

pは,質問文の「inttp[0].inttaP」ですね。
「p[1]で,intt1[1]をアクセスできる」で合ってますか?

お礼日時:2022/01/02 09:08

「p をインクリメント」しないで, アクセスしてほしい. なんかするたびにいちいち値を変えるのは面倒だし, 間違いも起こりやすくなる.



あと, そこに出てくる p が質問文の何に対応しているのかはわかってるかな?
    • good
    • 0
この回答へのお礼

ポインタ関係は,難しいです。
char *p1;とint *p2;でそれぞれ+1すると,
p1とp2の増加量が異なるのが,受け入れがたいというのがあります。

本題のpを加算しないでやる方法は,わからないです。
pが対応するのは,rc=subb(&inttp[0]);の「&inttp(0)」対応していると
考えますが,間違っていますか?

お礼日時:2022/01/01 10:54

たとえば


p = &intt1[0];
としたとしよう.

この p を使って, intt1[1] をアクセスすることはできるでしょうか? できるとしたらどうすればいい?
    • good
    • 0
この回答へのお礼

pの値を加算してintt1[1]をポイントする,だと考えますが,ポインタ関係は理解が十分ではないので,間違っているかもしれません。
p++;
p->intt1[0];

お礼日時:2021/12/30 09:07

main における intt1[1] がどのような形でアクセスできるのかを考えてみよう. 必要なものは関数の方でわかるはずだよ.



ところで intt1~intt4 の設定で wk が 0 から 8 までになっているんだけど, それでいいの?
    • good
    • 0
この回答へのお礼

回答,ありがとうございます。
「subb(&inttp[0]);」の呼び出しのパラメタで,subb()でa[1],a[2]・・・が参照できる方法がないか,教えてもらいたかったのです。現状ではアドレスが解決しないので,無理ということですよね。

これは,今回の質問用のサンプルとして作ったものなので,9回しかループしなくても大丈夫です。

お礼日時:2021/12/29 08:49

rc=subb(&inttp[0]);



と同様に、アドレスを渡せば良いのでは?
    • good
    • 1
この回答へのお礼

回答,ありがとうございます。
新たにアドレスを下位関数に渡すという追加処理が必要ということですね。
了解しました。

お礼日時:2021/12/28 09:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!