• ベストアンサー

静的動的とは?

静的とはあらかじめ決められ変わらないもの 動的とは状況に応じて変わるものとあるのですが 以下の文のstaticの部分を見る限りcount変数は変化してるので動的と違うの?と混乱してるのですが なぜこのcount変数は静的なのか説明をお願いします int main(void) { count(); count(); return 0; } int count(void) { static int count; count++; printf("%d\n", count); return 0; } よろしくお願いします

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

  • ベストアンサー
回答No.2

静的や動的としている”対象”がなんであるかを理解すると すんなりいきますよ。 この例だと、static宣言で静的としているのは、count変数の「中身」の話ではなく count 変数の「置き場所や入れ物の大きさ」のことです。 ですので、static宣言したcount変数の置き場所は動かない静的なものではありますが その変数の中見は、変更できることになります。 (中身を変更できないように固定化したいときに使うのは、staticでなくconstです) このように関数内で変数を、static (静的=動かせないもの) としていると、 関数が終わっても その変数が確保されたままになるので 例えば++でインクリメントすれば、関数が呼ばれるたびに、1,2,...と増えて行くことになります。 つまり、関数内の変数を 1回ごとに使い捨てにするのではなく、 前回の値を確保したままにしたいときに、static宣言を使います。

ashitanotenki11
質問者

お礼

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

その他の回答 (1)

  • f272
  • ベストアンサー率46% (7994/17084)
回答No.1

「count変数は変化してる」というときの変化しているのは変数の値です。変数の使用しているメモリ領域は変化しませんし,その関数から抜けたあともメモリ領域は開放されず保持されています。そういう意味で静的なのです。

ashitanotenki11
質問者

お礼

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

関連するQ&A

  • グローバル変数について

    ◎1--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; glb=30; printf("main a=%d glb=%d\n",a,glb); func(); return 0; } void func(void) { int b=88; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎1の実行結果----------------------- main a=20 glb=30 func b=88 glb=30 ------------------------------------- ◎2--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; func(); printf("main a=%d glb=%d\n",a,glb); return 0; } void func(void) { int b=88; int glb=30; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎2の実行結果----------------------- func b=88 glb=30 main a=20 glb=0 ------------------------------------- 以上2つのプログラムで、◎1は参考書を参考に作成したものです。 ◎1のプログラムで、グローバル変数glbの値をmain( )関数内で設定していたので、次に◎2のようにfunc( )という関数プロトタイプ内で、グローバル変数glbの値を設定し、main( )関数内のprintf文でも表示させようと思ったら、「glb=0」となってしまいました。 なぜこのようになってしまうか、教えてもらえたら嬉しいです。

  • 関数について

    いつも、お世話になっています。 また、教えてもらえないでしょうか? printf("count%d\n", count);では、カウントしているのですが、 mainに戻ったときに、 printf("登録件数%d\n", max_syain); では 0 でかえってきます。 何故なんでしょうか? 教えてください。 int SYAINTOUROKU(syain data[], int syain_num) { int count = syain_num; int touroku_repeat; while (1){ if(count > MAX_NUMBER){ return 0; } syaintouroku(data, count); count++; sortID(data, count); write_syainfile(data, count); scanf("%d", &touroku_repeat); printf("count%d\n", count); if(touroku_repeat == 0) break; } return (count); } int main(void) { syain meibo[MAX_NUMBER] = {{0x00} ,{0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00}, {0x00} ,{0x00}, {0x00}}; int max_syain = 0; SYAINTOUROKU(meibo, max_syain); printf("登録件数%d\n", max_syain); return 0; }

  • Cのポインタについて(関数への値渡し)

    C言語のポインタに関する質問です。関数に引数を渡す方法として以下の誤ったswap関数でなぜだめなのかいまいち得心できません。わかりやすくかみくだいて説明していただけると有り難いです。 できましたら、トレースともうしますか、変数の値の動きを詳細に段階的にプログラムの流れに沿って追っていって、だからこうなんだよ、みたいな解説がいただけたら有り難いです。わがままいってすみません。 /* 誤ったswap関数の宣言 */ void swap(int x, int y); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(num1, num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* 誤ったswap関数の定義 */ void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; } ---------- /* swap関数の宣言 */ void swap(int *pX, int *pY); int main(void) { int num1 = 5; int num2 = 10; printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); printf("変数num1とnum2の値を交換します。¥n", num1); swap(&num1, &num2); printf("変数num1の値は%dです。¥n", num1); printf("変数num2の値は%dです。¥n", num2); return 0; } /* swap関数の定義 */ void swap(int *pX, int *pY) { int tmp; tmp = *pX; *pX = *pY; *pY = tmp; }

  • (void *)と&の違い

    #include<stdio.h> void * func(void *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",(int)p); (int)p += 100; printf("p = %d\n",(int)p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func((void *)number);★1 return 0; } -------------------------------------------------------------- #include<stdio.h> void * func(int *p){ printf("□■□func開始□■□\n"); printf("pのアドレス = %p\n",p); printf("p = %d\n",*p); *p += 100; printf("p = %d\n",*p); printf("□■□func開始□■□\n"); return NULL; } int main(void){ int number = 30; printf("numberのアドレス = %p\n",&number); func(&number);★2 return 0; } 上記の2つは同じ結果になるのですが★1と★2のそれぞれの違いがわかりません。どなたかご教授をお願いします。

  • C言語の参照はずしについて

    ソートのプログラムなんですが #include <stdio.h> #include <stdlib.h> int comp(const void *, const void *); int main() { int i; int test[6] = {10, 8, 2, 6, 4, 0}; qsort(test, (size_t)6, sizeof(int), comp); printf("\n"); for (i = 0; i < 6; i++) printf("%d\n", test[i]); return 0; } int comp(const void *a, const void *b) { static int i = 1; printf("%02d--%d,%d\n", i, *(int *)a, *(int *)b); i++; return (*(int *)a - *(int *)b); } 最後のreturnの()の中身がよくわかりません。「参照はずし」という事をしてるらしいんですが「参照はずし」とは何ですか意味も教えてください。

  • C言語 外部変数について

    #include<stdio.h> int count; int f(int x){  int i;  for(i=0 ; x < 10 ; i++){   x*=2;   count++;   }  return x; } int main(void){  count=0;  printf("%d %d",f(1),count);  return 0; } のようなプログラムを作って実行してみたところ f(1)の部分は1024と自分の目的通りの結果が返ってきましたが countの部分が0とでてきてしましました 関数内で10回の繰り返しを行ったので 10がはいってると思ったのですが どこを直せば10の値がでてきますか?

  • C言語 

    #include <stdio.h> int main(void) { int ch; int count = 1; while( (ch = getchar()) != EOF) { if(ch == '\n') count++; } printf("行数は%dです。", count); return(0); } このコードの if(ch == '\n') count++; の部分がわかりません。 aを入力したとしてchにaが入っても、a=='\n'にはならないと思うのですが、実行して見ると行数がカウントされます。 (ch=='\n')というのはchと改行が同じなら行数を1増やすと言う事になると思うのですがよくわかりません。 教えてくださいm(_ _ )m

  • Cのローカル変数でstatic以外の使い方?

    C言語の課題について教えてください [課題] 以下の関数がある。各関数の引数、変数は自由に設定していい ・int main() ・void func() ・Point *get() { /* 構造体のアドレスを返す */ } ・構造体 typedef struct { int x; int y; int h; int w; }Point; 問題 main関数から、func関数を経由して、get関数を経由し値を取得し、表示する 以下が考えたソースになりますが、これだと、 ローカル変数でstaticを使っているので、get関数が固定値ではなく、 取得のたびに値が変わるような場合には、だめだといわれました。 考えたのですがよくわからないので、どういう場合に駄目なのかと、 どのように修正すればいいのか教えてください。 #include <stdio.h> typedef struct { int x; int y; int h; int w; }Point; void func(Point **); Point *get(); int main(void){ Point *get; func(&get); printf("get.x:[%d]\n",get->x); printf("get.y:[%d]\n",get->y); printf("get.h:[%d]\n",get->h); printf("get.w:[%d]\n",get->w); return 0; } void func(Point **pw){ *pw = get(); printf("Wrapper: pw==%p\n",pw); } Point *get(void) { static Point pget; pget.x = 2; pget.y = 2; pget.h = 30; pget.w = 40; return &pget; }

  • 配列要素内の数値

    #include <stdio.h> int main(void) { int arr[1]={123456789}; int *x[1]; *x = arr; printf("%d ",*(x[0])); /* 123456789 と表示*/ return 0;} 実行すると123456789と表示されるまでは分かるのですが、*(x[0])の部分を別の書き方にして、arr[0]に入ってある「123456789」という数値の千の値である6という数値のみを取り出して、表示することは可能なのでしょうか?(6000と取り出したいのではなく、6として取り出したい) 次のように数値を文字列の一つ一つを扱うかのように、扱いたいのです。*(x[0])の部分の変更だけで6を取り出せるような方法はありますか? #include <stdio.h> int main(void) { char *arr[]={"pen"}; printf("%c\n",*(arr[0]+0)); printf("%c\n",*(arr[0]+1)); printf("%c\n",*(arr[0]+2)); return 0;}

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

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