• ベストアンサー

関数の最初の変数有効期限について

最近C言語を勉強しているのですが変数の有効範囲について教えてください。 ローカルやグローバル変数があるのが分かって関数内の変数も関数内でのみ有効というのも理解したのですが int a( int b ); という関数の最初に書く括弧の中のbと宣言している変数も関数内に含まれているという事で良いのでしょうか?。

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

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

#2 を読んで気づいた. プロトタイプ宣言中の仮引数名なら, 「そのプロトタイプ宣言のみ」で有効です. 現実的には「たまたまそこに書いてあるだけで本質的な意味はない」としていいけどね.

tenpasu
質問者

お礼

お二人ともありがとうございました。 できればお二人とも分かりやすかったのでどちらもベストアンサーにしたいのですが今回は最初に書いてくださったTacosanさんをベストアンサーにします。 ありがとうございました。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

これはプロトタイプ宣言というヤツです。 Cではあるシンボルが出てきた場合は事前に 定義されていることが原則で、例えばmainの 前にaという関数が記述されていれば、mainの 中でaを使用することができますが、aがmainの 後に記述されていると、エラーになります。 そこで、あらかじめaという関数があることを宣言 しておくのです。ここで重要なことは戻り値の型、 関数の名前、パラメータの型と個数です。 つまり、パラメータの名はどうでもよいのです。 以前はint a(int,char*);のように型だけ書いて いました。(今でもこういう書き方はOK) 今はインテリジェンスでの表示なども考慮して、 意味のある名前を付ける方が一般的ですが、 プロトタイプ宣言内の名前には効果はありません。 宣言で使った名前を使う義理は無く、関数本体で 別の名前にしても全く問題ありません。 ということで、質問の回答としては以下の通りです。 「bは仮の名前であって、関数の中に含まれない」

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

そうです. 仮引数は「関数の先頭で (初期値を与えて) 定義した変数」とみなしていい.

関連するQ&A

  • 外部変数について

    今Vine Linuxを使ってC++でプログラムを書いているのですが教えて頂きたいことがあります. C++の初心者の為,変なことをお聞きしますがお許しください. extern宣言で他のソースのローカル変数を参照する方法はないのでしょうか? 例えば,a.cとb.cというソースがあったとします. a.cの関数内でint i;と宣言されている変数をb.cからextern int i;という風にしたいのですが, こうするにはa.cでグローバル変数としてint i;を定義する以外方法はないのでしょうか? できればグローバル変数を使いたくないのですがこれ以外では無理でしょうか? あともう一つお聞かせ下さい. メイン関数の引数を別の関数,またはソースで使うということはできないのでしょうか? int main( int argc, char *argv[] )のargv[1]というのを別の関数で使用したいのですがこれも無理でしょうか? 馬鹿な質問だとは思いますが,どなたかお答え頂けますでしょうか? よろしくお願いします.

  • ・関数内で宣言された変数の扱い(C入門本の説明で)

     以下C言語入門書の説明ですが!  いまいちわかりません?   ・関数内で宣言された変数の扱い 関数内で宣言した関数は、その関数内でのみ有効な変数になります。関数が異なれば、同じ変 数名で宣言することができます。例えば、main関数と(?)kansuu関数で、同じ(?)hennsuuという名 前の変数を宣言することができます。  int main() { int (A)hensuu = 0; (B)kansuuu(1); } int (C)kansuu(int hikusuu) { int (D)hensuu = 10; }  列のmain関数で宣言されている(?)hensuuと、さ(?)kansuu関数で宣言されている(?)hensuuは 同じ名前ですが、独立した異なるものです。(?)kansuu関数が実行されているときに、(?)hensuuの値 を変更しても、main関数で宣言されている(?)hensuuの値は変更されません。 また、(?)kansuu関数を実行している間だけ、(?)kansuu関数で宣言されている(?)hensuuが有効です。 (?)kansuu関数から呼び出し元でるmain関数に戻った際は、(?) kansuu関数で宣言した (?)hensuuはもう有効ではなくな、値を参照することもなくなります。     以上の説目で、   (A)hensuu、 (B)kansuuu、(C)kansuu、(D)hensuu  (アルファベット)を分かりやすいよう追加しました。   説明の   (?)にプログラムの(A)~(D)をつけたらどうなるか知りたいです。 (何となくわかるですが?)   よろしくお願いします。

  • c言語 関数宣言

    c言語で書かれたプログラムを見ていると、ちょっとわからない関数宣言がでてきました。 関数宣言をしているのだと思うのですが、これはいったいどういうことなのでしょうか。 grad_pf(x, a, yfit, dyda, ma) float x; float a[]; float *yfit; float dyda[]; int ma; {            処理・・・・・・・・ } 中括弧の前で宣言された変数はどういったものなのでしょうか。 よろしくお願いいたします。

  • 関数の戻り値による変数の初期化

     関数の戻り値で変数を初期化すると、予期せぬ動作をする可能性があると聞いたのですが、実際にそのようなことがあるのでしょうか? また、予期せぬ動作をする場合、そのような現象が起きる環境と原因は何なのでしょうか?    使用している言語はC++なので、例えば下のような動作です。   int a = f();   ・対象の関数が標準関数かどうかは不明です。   ・変数はローカルを想定しています。  ちなみに私は、C,C++を2,3年勉強しており、会社での実践経歴が1年程度です。

  • 変数宣言は、最初に全部列挙したほうがいいですか?

    100行ぐらいのスクリプトだと、10個ぐらい変数宣言しなければいけませんが、 最初にまとめて書くメリットを教えてください。 ※他人のコードを読んでいて、最初にすべての変数宣言があったら、最初に戻らないとわからなくなり、その時、その時に、変数宣言があったほうがいいかなと。 ※言語によって違ってきますが、例えばJAVASCRIPTだとグローバル関数とローカルの問題があります。そのようなことを踏まえて、ご経験、ご意見を教えてください。

  • C言語のグローバル変数の初期化について

    C言語において int a = 1; // 動的グローバル変数 static int b = 2; //静的グローバル変数 funcA(){ int c = 3; // 動的ローカル変数 static int d = 4; //静的グローバル変数 ・ ・ ・ } 上記のように各種変数を初期化したとします。 "c"のような動的ローカル変数であれば、funcA()が呼ばれたときに毎回初期化されますよね? では ・"d"のような静的ローカル変数は、初めてfuncA()が呼ばれたときに初期化されるのですか? ・"a","b"のyほうなグローバル変数は、どのタイミングで初期化されるのですか? 以上2点について伺いたいと思います。 ちなみに、組み込み機器むけのソフトウェアを想定しています。

  • C言語のローカル変数の使い方について質問です。

    C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }

  • メモリセルと変数 ( a = b + cの意味)

    メモリセルと変数の関係について勉強しています。 動的(non-static)なローカル変数 bとcが宣言されたあと、 次の文が 出現したとします。 int a = b + c; 問題を解いてるのですが、問題によると、 この文章で 変数とメモリセルが結びつく 機会を二つ答えよ。 「変数aの値が aのメモリセルに保存される」というのが、一つだと考えるのですが、もう一つが思いつきません。 変数bは "int a = b + c;" の以前に、宣言されているので、bとbのメモリセルはこの文より前に結びついてます。 同様にcも この文より前にメモリセルと結びついています。 考えられるのは、b + c なのですが、 a = b + c の意味が 「b+c の計算結果の値を a のメモリセルに 保存する」 という 答えが二つになります。 a = b +c の意味はこれでいいのでしょうか? 文章がわかりにくくてすみません。 要はa = b + cの本質的意味が知りたいのです。

  • 関数の仮引数は宣言か式か

    ”関数の仮引数の宣言”は”変数の宣言・定義”と同じように”宣言”と明確に考えるべきなのか”関数の仮引数”を”式”と考えて良いのかという問題です。 私が迷ってしまったのは"配列を仮引数"にとった例です。 規則として ”int a[ ] が int *a と同じ意味になるのは、唯一、関数の仮引数の宣言のばあいだけである”という規則がありますが、これは”関数の仮引数の宣言”は変数の宣言・定義”と同じように”宣言”と明確に考えている例だとおもいます。 int a[ ] が int *a と型名 変数名(引数名)と宣言の形をとっているので当然だと思いますが、一方 配列は、式の中で「先頭へのポインタ」によみかえられる。               ↓ 関数の引数は式なので、配列は「先頭へのポインタ」に読み変えられる←引数部分を”宣言”ではなく”式”と捉えてる←ここが私の迷っているところ               ↓ よって、関数に渡ってくるのは、結局はつねにポインタだ。 という説明もあります。 私の今までの理解ではc言語では”宣言の部分”と”式”の部分は明確に区別されるものと考えていました。”宣言部分の初期化の="と”代入の=”とは明確に区別されていました。 それと同じように”関数の仮引数の宣言”は”宣言部分”と捕らえるのか”式”ととらえるのか ”宣言”と”式”が私の頭の中混乱しています。 宜しくお願いします。

  • 引数のポインタ変数をローカル変数に設定方法

    引数で受け取ったポインタ変数を受け取った関数内のローカル変数に設定するには、 どうしたらよいでしょうか? イメージとしては、 int abc(char *a){ *a = '3' ローカル変数b = *a }

専門家に質問してみよう