質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1064閲覧

配列とポインタ

ikuo-biyori

総合スコア56

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/11/26 08:23

編集2016/11/26 08:43

いつもお世話になっています。C言語初心者で勉強中です。以下の分からないところを教えてください。
以下が、コードです。

C言語

1コード
#include<stdio.h> #define N 100 void find(int*);/*プロトタイプ宣言*/ int main(){ int i; int index[N];/*配列を宣言する。-(1) */ find(index);/*indexの配列を関数で実引数として使う。 */ for(i=0;i<5;i++){ printf("index[%d]=%d\n",i, index[i]); } return 0; } void find(int *list)/*indexの配列がlistに送られる。*/ { int i,n=0; for(i=0;i<10;i++){ list[n]=i;/*-(2)*/ n++; } }

(1)の段階では、index[0]=?,index[1]=?,index[2]=?の状態。
(2)の段階では、list[0]=0,list[1]=1,list[2]=2というようにlistの中身が分かる。-(A)
プログラムの実行結果が、
index[0]=0
index[1]=1
index[2]=2
index[3]=3
index[4]=4
というようになりました。
なぜ、indexの中身が分かるようになったのか分かりません。
(A)のときにindex[0]=0,index[1]=1;index[2]=2というようにindexの中身も分かるのでしょうか?どうかよろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

私的にはfind関数が名前と処理内容が合ってないことにすごい違和感を覚えますが…。
とさておき、

(1)の部分では、index[0]=?index[1]=?index[2]=?index[3]=?の状態

そうですね。ローカル変数なので、中身は不定の状態です。

(2)の部分では、list[0]=0;list[1]=1;list[2]=2というようにlistの中身が分かる

ここ誤解してますね。ここは中身を「見ている」のではなく、「値を設定」しています。引数として配列変数indexの先頭アドレスを受け取っているので、indexの各要素に対して値を設定するになります。

(A)のときに、index[0]=0;index[1]=1;index[2]=2というようにindexの中身も分かるのでしょうか?

find関数の中で、(アドレスを間接参照して)indexに値を設定しているので、main関数でindexの中身を知ることができます。もしデバッガを使えるようでしたら、デバッガを使って見てみてください。その様子がよくわかります。

ポインタ変数の中身がメモリ上のアドレスであること、C言語ではアドレスが分かればどこでも参照することができてしまうということを理解できれば、この問題はわかるようになると思います。

投稿2016/11/26 08:49

archiver

総合スコア1557

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuo-biyori

2016/11/26 23:04 編集

確認なんですが、list[0],list[1],list[2],list[3]の番地がindex[0],index[1],index[2],index[3]の番地と一致しているから、list[0]=50なら、index[0]=50というようになるということでしょうか? この解釈であっていますか。
archiver

2016/11/27 00:38

その解釈で合っています。 find関数にindexのアドレスを渡していることで、find関数でローカル変数であるindexの各要素を参照することができ、find関数内でindexの中身を操作できるということになります。
ikuo-biyori

2016/11/27 00:53

ありがとうございます。よく分かりました。
guest

0

このプログラムは、こんな様に実行されています。

int index[N];/*配列を宣言する。-(1) */

この段階では、Nが100なので index[100]となりintは長さ4バイトの100個の長さの
領域がメモリに確保された状態です。但し、値がなんであるかはわかりません。
とにかく100個のintが入る器ができた状態です。

find(index);/*indexの配列を関数で実引数として使う。 */

このfind関数は、ポインタ渡しでindex配列に0から9までの値をセットする様にコーディングされていますので
index[N]には、0~9までの数字がセットされます。

for(i=0;i<10;i++){

list[n]=i;/-(2)/
n++;

このループではiとnは、同じ数字ですので、下記の処理を行います。
list[0]=0
list[1]=1
list[2]=2
.......
.......
list[8]=8
list[9]=9
ここでのポイントは、*listで渡されたのもがlist[]で同じになる部分です。
find(int list)
ですのでlist[9]=9は、配列の先頭アドレス
listから9個先のアドレスをさします。
listのアドレスがもし0だとすると、list[9]アドレス36となります。

for(i=0;i<5;i++){

printf("index[%d]=%d\n",i, index[i]);
}

これをprintfにて0から5までを表示しています。
ここを5をNにしてfor(i=0;i<N;i++){みるとさらによく理解できると思います。
表示できない場合もありますのでリダイレクション「>」でファイルに吐き出すのが良いです。
./a.out >hoge.txt

このような書き方もできます。

c

1void find(int *list)/*indexの配列がlistに送られる。*/2{3 int i,n=0;4 for(i=0;i<10;i++){5 *(list+n)=i;/*-(2)*/6 n++;7 }8}9 10void find(int *list)/*indexの配列がlistに送られる。*/11{12 int i=0;13 int *p;14 p=list;15 for(i=0;i<10;i++){16 *p++=i;/*-(2)*/17 }18}

投稿2016/11/26 11:44

編集2016/11/26 12:16
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問