C言語練習問題
C言語練習問題
環境について
C言語の練習問題です。
開発環境は以下の通り。
PC:MacBook Pro 2011early 15inch
OS:Windows 8.1(デュアルブート)
メモリ:16GB(8GB x 2)
CPU:Core i7-2635QM 2.00GHz
コンパイラ:MinGW-w64 5.3.0 (posix, sjlj)
※問題文に書いてあるプログラムを実行する際は自己責任で実行してください。
※※各問題へのリンク一覧を作成しました。
問題
次のプログラムを作った。コンパイル、実行に関して以下の問いに答えよ。
プログラム(test37.c)
1 2 3 4 5 6 7 8 9 10 | #include <stdio.h> int main( void ){ int a = 10; int b = 20; int c = 30; int (*pnum)[3] = {&a, &b, &c}; printf ( "*pnum[0] = %d\n" , *pnum[0]); return 0; } |
問1.次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。
A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の中の空欄を埋めよ。
なお、コマンドを入力する前はディレクトリ内のファイルはtest37.cのみであった。
1 | gcc test37.c -o test37.exe |
選択肢A,B,C
A.コンパイルに成功して( 空欄1 )が生成される。
B.( 空欄1 )ためコンパイルエラーが起こる。
C.コマンドの( 空欄1 )の部分が間違っているためコンパイルが実行されない。
問2.その後、次のコマンドをコマンドプロンプトから打ち込んだ。どのような結果になるか。 A,B,Cの選択肢から適切なものを選べ。また、選んだ選択肢の空欄を埋めよ。
1 | test37 |
選択肢A,B,C
A.ファイルが実行され( 空欄1 )と画面に表示される。
B.( 空欄1 )というファイルがないため実行できない。
C.コンパイルはされているが、( 空欄1 )という問題があるため実行は危険である。
解答
問1
B.( 配列の宣言に見える部分がおかしい )ためコンパイルエラーが起こる。
※該当内容が指摘できていれば正解とする。解説参照。
問2
B.( test37.exe )というファイルがないため実行できない。
解説
問1,問2
今回は「int型のポインタ」を要素とする配列を使おうとしている。
配列の宣言は以下のように行われている。
1 | int (*pnum)[3] = {&a, &b, &c}; |
この宣言の右辺は、変数a、変数b、変数c のアドレスを要素とする配列を初期化子を用いて代入しようとしている。
それに対して左辺は int (*pnum)[3]と宣言している。これは一見すると「int型のポインタを要素とする、要素数3の配列」の宣言とも見れるが、実際には、「『要素数3の int型の配列』を示すポインタ」となる。※2016/09/13 15:30修正
そのため、コンパイルエラーとなる。
もし今回のプログラムで「int型のポインタ」を要素とする配列を使用する場合、以下のようにする。
プログラム(test37_1.c)
1 2 3 4 5 6 7 8 9 10 11 12 | #include <stdio.h> int main( void ){ int a = 10; int b = 20; int c = 30; int *pnum[3] = {&a, &b, &c}; printf ( "*(pnum[0]) = %d\n" , *(pnum[0])); printf ( "*(pnum[1]) = %d\n" , *(pnum[1])); printf ( "*(pnum[2]) = %d\n" , *(pnum[2])); return 0; } |
実行結果
1 2 3 4 5 | > gcc test37_1.c -o test37_1.exe >test37_1.exe *(pnum[0]) = 10 *(pnum[1]) = 20 *(pnum[2]) = 30 |
実践力が身につくC言語講座 連載リンク
競技プログラミングをイメージしたライブラリ活用講座
競技プログラミング風-標準Cライブラリ入門 連載
アルゴリズムをマスターして技術力アップ!
実践アルゴリズム講座 連載
パズルゲームの解析をテーマにしたC++講座
ゲーム解析プログラミング 連載