• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C言語 初期化について)

C言語 初期化について

このQ&Aのポイント
  • C言語の初期化について混乱しております。
  • 【初期化】とは、場面によって意味が変わるのでしょうか。どの場面に通じる【初期化】の本来の意味を教えてください。
  • C言語の初期化について、様々な場面での使い方や意味がわからなくなっています。

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

  • ベストアンサー
  • YKKIKS63
  • ベストアンサー率44% (22/50)
回答No.2

初期化が必要な理由はご存知ですよね。 Cでは、変数宣言しただけでは、その変数の中身は不定、つまり、何が入っているかは保証されません。 よって、その変数を使う際には必ず何らかの値をいれておかなければなりません。 その作業を「初期化」と言っているだけ。 教科書とかの説明では使うシーンが異なっているだけで、やっていることはANo1の方がおっしゃるように、同じ事にすぎません。

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

「初期化」ってのは「最初の値を定める」くらいの意味です. なので, これまでに出た以外にも「初期化」という操作はあって, 関数を呼び出すときに「引数を渡す」のも (受け取る側の) 仮引数から見ると「初期化」だったりします. ただ, どうなるかわからないのに「エラーが出る」と言い切るあたり, 「イジワル」の面目躍如ってところでしょうか>#6. あと, 「今の C」なら「for文の初期化では変数は普通宣言できません」ってこともないですよ>#4.

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • devman
  • ベストアンサー率42% (20/47)
回答No.6

ちなみに、 (1) グローバル変数 int i; int main(void) { printf("%d", i); } (2) ローカル変数 int main(void) { int i; printf("%d", i); } (1)はエラーが出ません。 (2)はエラーが出ます。 この違いも確認してみてください。 ((1), (2)も変数の初期化を行っていないのに、 なぜ、(1)はOKで、(2)はダメなのかについて) # 私はイジワルなので答えは書きません。

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 (1)と(2)の違いは宿題にします(今は勉強不足で分かりません)。

全文を見る
すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

「初期化」とは、「初期値を設定する」「初期状態にする」ことです。 例にある for (i = 1;i <= 10;i++) では「i++しながらi<=10を満すまで繰り返す」のですが、最初のiの値が変われば当然ループ回数もiの値も違ってきます。 そのため、最初のiの値(初期値)して i=1 と1を代入しています。初期値を代入するので初期化です。 他の例もすべて、「最初の値を設定」しています。ですから「初期化」です。 このような、プログラム上での意味としての初期化の他に、C言語の機能としての「初期化」があります。 char str[] = "MARIO"; と char str[6]; str[0]='M'; str[1]='A'; str[2]='R'; str[3]='I'; str[4]='O'; str[5]='\0'; とでは、この直後のstrは同じものです。どちらも意味的には「strを"MARIO"で初期化した」ことになります。 しかし、C言語の文法としてはまったく別のものです。 前者は「配列の初期化」です。 後者は「配列の宣言→配列の各要素への代入」です。「初期化」ではありません 初期化と代入とでは、できることが違います。 例えば、この例のように、「配列を文字式で初期化」はできます。しかし char str[6]; str="MARIO"; と、「配列に文字列を代入」はできません(すくなくとも、期待通りには動きません)

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • kngj1740
  • ベストアンサー率18% (197/1052)
回答No.4

初期化とは変数の宣言時に値を設定する事を言います。for文の初期化では変数は普通宣言できません(C++なら可能ですが)。厳密な意味での初期化ではないです。あくまでもfor文の説明としての初期化です。

501xx
質問者

お礼

ご回答いただき、ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.3

>初期化】とは、場面場面で意味が変わるのでしょうか。 はいそうです。 「初期化」は普通の日本語なので、使われる場面に応じて様々な意味を持ちます。 Cの説明の中でも「初期化」は1つの意味だけではありません。 少なくとも、 ・変数の初期化・・・・・変数宣言時に値を設定すること or 変数宣言時に値を設定されなかった変数に対して最初に値を代入すること ・for文での初期化部・・・・・for(A; B; C) のAの部分に何か書いた物 では意味が異なります。 これらと違い、何か状態を変化させたときに、一番最初の状態に戻すという意味もありますね。 >どの場面に通じる【初期化】の本来の意味を教えてください。 「初期状態にする」です。

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。
  • drum_KT
  • ベストアンサー率43% (1108/2554)
回答No.1

場面で意味は変わっていませんよ。初期化=「変数の最初の値を代入して決めること」です。「初期」の値を決めるので「初期化」。その後、計算したりなんだりして値が変わっていくのが普通ですが、その「最初の値」を入れることを言います。 for文の時は、カウント変数(最初の例ではi)の最初の値をfor文の中で代入して決めているというだけです。書き方がちょっと特殊なだけでやっていることは他の例も全部一緒です。

501xx
質問者

お礼

ご回答いただき、ありがとうございました。 勉強になりました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }

  • C言語について教えてください

    ファイルの文を読み込み、I、Weなどの定めた単語の数を数えるプログラムを作りたいのですが、うまくいきません。 具体的な問題点は、単語の数を数える際、一致する単語があった場合、再び最初から文を見直すため、無限ループしてしまう。 We,WE、weなど大文字小文字の違いで単語が数えられないなどです。 #include <stdio.h> #include <stdlib.h> #include <string.h> int main( void ) { char filename[FILENAME_MAX]; int j=0; int k=0; int l=0; int m=0; int n=0; int o=0; int w; char str[50]; FILE *fp; gets(filename); fp = fopen(filename,"r"); { if(fp==NULL) { printf("ERROR"); return -1; } } fscanf(fp,"%50s",str); for(w=0;w<=j+k+l+m+n+o;w++) { if(strcmp("I",str)==0) { j++; } if(strcmp("We",str)==0) { k++; } if(strcmp("You",str)==0) { l++; } if(strcmp("He",str)==0) { m++; } if(strcmp("She",str)==0) { n++; } if(strcmp("They",str)==0) { o++; } } printf("I: %d\n",j); printf("We: %d\n",k); printf("You: %d\n",l); printf("He: %d\n",m); printf("She: %d\n",n); printf("They: %d",o); fclose(fp); return 0; }

  • C言語の配列とポインタについて

    C言語の配列とポインタについてわからないことがあります。 以下のソース例は、10個の値の平均値を求めるプログラムです。 コメントを挟んだ部分が疑問点です。 【ソース例】 #include <stdio.h> int getaverage(int *data); int main(void) { int average,array[10] = {15,78,98,15,98,85,17,35,42,15}; average = getaverage(array); printf("%d\n",average); return 0; } int getaverage(int *data) { int i,average = 0; for (i = 0;i < 10;i++) { average += data[i]; /*ポインタ変数なのに? */ } return average / 10; } 【実行例】 49 このdata[i]はポインタ変数であり、 配列arrayの i 番目の要素であるarray[i]の"アドレス" が代入されているはずだと思うのですが、 なぜ通常の整数変数であるaverageと数値計算が出来、正しい結果が出たのでしょうか? あたかもdata[i]には、 array[i]の"アドレス"ではなく、 array[i]の"メモリの中身"が代入されているようです。 どういうことでしょうか? 回答よろしくお願いします。

  • C言語の配列について

    配列を20 定義し値を入力して合計値を出したいのですがどうすればよいのでしょうか 下のソースでエラーはおこりませんでした 何がちがうのでしょうか #include <stdio.h> int main() { int a[20]={}; int i, sum; printf("整数を入力してください:"); scanf("%d",&a); printf("\n"); for (i = 0; i < 10; i++) { sum += a[i]; } printf("sum= %d\n", sum); return 0; }

  • C言語プログラミングで・・・

    つい最近、C言語プログラミングのお勉強をはじめた中学生です。 ある程度かけるようになってきて、こちらのサイトに掲載されている練習問題を解いていました。 http://akabas.net/lib/CExercise.aspx いろいろといていく中で、配列の章にはいりました。 配列の章の中の6問目と7問目の九九についてのコードを書いていたところ、どちらも問題なく実行を終了した後 「○○.exeは動作を停止しました。」というメッセージが現れました。 これはコードに何か問題があるのでしょうか? _____________________________________________________________________ //6問目 #include <stdio.h> void line (void){ int cnt; for (cnt = 0; cnt < 30; cnt++) printf("_"); printf("\n"); } int main() { int kuku[9][9], i, j; printf("九九を表示します\n"); for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++){ kuku[i][j] = i * j; printf("%d * %d = %d\n", i, j, kuku[i][j]); } line(); } return 0; } ____________________________________________________________________ //7問目 #include <stdio.h> int main() { int kuku[9][9]; int i, j; for (i = 1; i <= 9; i++){ for (j = 1; j <= 9; j++) kuku[i][j] = i * j; } printf("1桁の数値(1 ~ 9に限定)を入力してください 1回目---"); scanf("%d", &i); printf("1桁の数値(1 ~ 9に限定)を入力してください 2回目---"); scanf("%d", &j); printf("\n"); printf("%d * %d = %d", i, j, kuku[i][j]); return 0; } ________________________________________________________________________________ まだ初心者のレベルなので、回答はできたらきつい言葉をつかってほしくないです^^; よろしくおねがいします ※こちらでは、Tabをうっているのですが、表示されてないみたいです。見づらいかと思いますが、よろしくおねがいします

  • グローバル変数の初期化のタイミング

    #include <stdio.h> int i; void main() { int j; printf( "%d\n", i ); printf( "%d\n", j ); } この結果が 0 -85899346 になるのですが グローバル変数 int i は初期化しなくても 0 になるということは 保証されているのでしょうか?

  • 初期化について C言語

    #include<stdio.h> #include<math.h> int main(void){ double array[10], sd, var, mean=0; int i; for(i = 0; i < 10; i++){ scanf("%lf",&array[i]); /* ベクトルの読み込み */ } for(i = 0; i < 10; i++){ mean+=array[i]; /* 和の計算 */ } mean/=10; /* 平均値 10 回の足し算が終わってから割り算をすること*/ for(i = 0; i < 10; i++){ var+=(mean-array[i])*(mean-array[i]); /* 差の2 乗の和 */ } var/=10; /* 分散 10 回の足し算が終わってから割り算をすること */ sd = sqrt(var); /* 標準偏差 */ printf("mean=%f\t var=%f\t sd=%f\n",mean,var,sd); for(i = 0; i < 10; i++){ printf("%.3f\tT: %.3f\n",array[i],10*(array[i]-mean)/sd + 50); /* 偏差値の表示 */ } return 0; } sdとvarは初期化されてないのですか? sdは標準偏差をmeanは平均値をvarは分散を示している

  • C言語のint型の配列が分かりません

    #include<stdio.h> int main(void) { int str[ ]={0,1,2} printf("%s\n", str); return 0; } というプログラムをC言語でつくってみましたが動きません.(012と表示されて欲しかったのですが) int str[ ]={1,2,3}の部分をchar str[ ]={'0','1','2'}とすれば動きます. そこで質問なのですが, printf("~%s~", (配列名));  はchar型の配列にしか適応できないのですか? ※追記 puts関数の定義は int puts (const char *str); であるそうなので char型の仮引数にはchar型のアドレスを渡さなければいけません. ではprintf関数の定義は一体どんなものなのですか?

  • C言語で困っています

    C言語で 100:1 99:2 98:3 .......ループ 1:100とやりたいんですが このやりかたがわかりません goto文などを使うのでしょうか? 一応コードは #include <stdio.h> int main(void) { int i,a; for(i=100; i>=1; i--){ for(a=1; a<=100; a++){ printf("%d:\n",i); break; printf("%d",a); } } return 0; } です まったくこれだと右側が出力されなくてだめみたいです どなたかお知恵をください お願いします

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

このQ&Aのポイント
  • Windows10で画面をロックした際や、画面を閉じた際にスリープモードに入ってしまう問題が発生しています。特に、バックグラウンドでの長時間処理を行いたい場合に影響があります。
  • 電源設定ではスリープ/休止関係の設定は無効にしているにもかかわらず、画面ロック後に1分程度でスリープモードに入ってしまいます。
  • Windows10の「モダンスタンバイ」機能が関連している可能性もあり、一部のレジストリ設定を変更しても問題が解消されませんでした。また、Lenovoの電源管理にも問題はないようです。
回答を見る

専門家に質問してみよう