• ベストアンサー

 ポインタを使って関数の値のやり取り

c言語の問題なのですが、2つの異なる1次元配列の積をseki関数を使って計算してもうひとつの配列に入れてmain関数で表示するのですが、うまく走りません原因がわかる人がいた教えてください。 作った実行文は、 #include<stdio.h> int seki(int *pa,int *pb,int *pc); main(){ int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0}; int i,*pa,*pb,*pc; pa=&a; pb=&b; pc=&c; seki(pa,pb,pc); for(i=0;i<11;i++) printf("%d,",*(pc+i)); } int seki(int *pa,int *pb,int *pc){ int j; for(j=0;j<11;j++) *(pc+j)=*(pa+j) * *(pb+j); } こんな表示が出てきます。 toi2.c: In function `main': toi2.c:7: warning: assignment from incompatible pointer type toi2.c:8: warning: assignment from incompatible pointer type toi2.c:9: warning: assignment from incompatible pointer type たぶんmain関数内で書いたseki関数の引数の型に問題があると思うのですが。

質問者が選んだベストアンサー

  • ベストアンサー
  • sato_ryu
  • ベストアンサー率48% (13/27)
回答No.1

質問の下に書かれているコンパイルエラーと思われる表示から そのエラーの原因が読み取ることが出来ます。 ここでの原因は、プログラム中次の3行がエラーであると指摘されています。 7行目:pa=&a; 8行目:pb=&b; 9行目:pc=&c; それぞれ、どういう状況かというと、 エラーをそのまま訳せば 『ポインタとしての割り当て方がおかしいですよ』 という風に捉えられます。 まず、整数型配列として宣言してあるaという変数があります。 これは、これ自身がポインタであるので &aという表記では、『ポインタ変数aのポインタ』ということになり、 純粋なポインタ変数paには代入する事ができません。 よって、上のエラーを解消するには、 pa = a; とすればよいでしょう。 (8,9行目も同様)

その他の回答 (2)

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.3

コンパイルエラーに関しては、No.2さんと同じ意見です。 また、そもそも pa = a は不要で、 直接 seki(a, b, c) として、関数に渡せます。 で、質問と全然関係ありませんが、 プログラムはポインタを使って、難しそうに書いてありますが、 配列を普通に使えば、簡単にかけます。 ポインタの課題等でなければ、こっちの方が良いかと思います。 #include<stdio.h> int seki(int pa[], int pb[], int pc[]); main(){ int a[]={5,2,3,5,3,2,4,8,9,9,7},b[]={4,3,8,4,6,2,8,9,1,6,4},c[11]={0}; int i; seki(a,b,c); for(i=0;i<11;i++) printf("%d,", c[i]); } int seki(int pa[], int pb[], int pc[]) { int j; for(j=0;j<11;j++) pc[j] = pa[j] * pb[j]; }

  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.2

int a[]={(略)}; と宣言した場合、識別子 a は「配列 a の先頭の要素へのアドレス」になります。 ですので、 pa=a; または pa=&a[0]; としてpaを初期化しなければいけません(pb、pcについても同じ) pa=&a; と書くと pa=&&a[0]; と、2重にアドレシングしてしまう事になります。

関連するQ&A