• ベストアンサー

関数の引数なしを変数に代入したら入ってきた数値は何?

デバッグソフトで自分のプログラムを動かしていたときに、 int test_func(char x) { x = x + 1; ------(中略)----------- return x; } int main(void) { int test_val; ------(中略)----------- test_val = test_func; ------(中略)----------- } このようにtest_func(char x)という関数の戻り値を変数test_valに代入するつもりだったのですが、間違って引数部分を書かずにコンパイルしてしまいました。 このときにコンパイルでエラーが出ると思ったのですが、コンパイル完了でデバッガで変数test_valをみてみると何か値が入っていました。 ちょっと気になったのですが、この変数の中に入った値はいったい何なのでしょうか。ご存じの方いらっしゃいましたらご教授お願いいたします。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

エラーはせずともワーニングは出ませんでしたか? test_func()の関数ポインタが入ったのだと思いますが。

techhouse
質問者

お礼

回答ありがとうございました。 ポインタって言うのはいわゆる”メモリ番地”のことですよね。

その他の回答 (1)

  • asuncion
  • ベストアンサー率33% (2126/6286)
回答No.2

関数は、コンピューターの中のどこかにいますので、変数と同様にアドレスを持ちます。 また、関数名は、その関数のアドレスを示します。 したがって、その文は、その関数のアドレス値をint型変数に代入する、 という意味を持ちます。

techhouse
質問者

お礼

回答ありがとうございました。 ポインタって言うのはいわゆる”メモリ番地”のことですよね。

関連するQ&A

  • 変数の中身を文字列に変換ってできますか?

    void func(int x) {  puts(&&&&&(x)); } こんな風にして、func という関数の引数に1が与えられたら、 putsを実行できるように1を文字列(つまり"1")に 変換してくれる&&&&&(x)という関数あるいは マクロが作成できないでしょうか? この質問をした目的は、変数の値によって、たくさんある ファイルのどれを開くか決定したいという所からきました。 fopen の引数が char *abc なんですもの。

  • 関数の引数をvoid*でキャストする

    最近見かけたCのプログラムで、関数の引数の型は void* なのですが、その関数を使うときに 引数をvoid*でキャストしていました。 例えば、 func ( (void*) p ); こういうことです。 私の知っている知識では、 void* と 任意の型のポインタは キャストなしに相互に代入可能です。 関数の引数でも、キャストは要らないものだと思っていました。 そうすると、引数を void* でキャストするのは無意味だと思うのですが、・・・ 違うのでしょうか。処理系によるとか。 逆に、関数の引数の型がchar*などで、渡すものが void* のときはどうなのでしょうか。 下のプログラムは、関数byte_orderの引数の型はvoid*ですが、int型へのポインタ( &a )を設定しています。私の環境では、コンパイルエラーも警告もないし、動作も正常です。 #include <stdio.h> #include <string.h> void byte_order(void *vp) { char char_array[4]; strncpy(char_array, vp, 4); printf("出力します:%x %x %x %x\n", char_array[0], char_array[1], char_array[2], char_array[3]); } int main(void) { int a = 0x12345678; byte_order(&a); return 0; } このプログラムは単なる一例であって、質問はバイトオーダに関するものではありません。 また、C言語の質問であって、C++ではありません。

  • binファイルが軽くなる変数への代入処理について

    変数に値を代入する方法はいろいろあるかと思いますが、 コンパイル後に最もバイナリファイルが軽くなる処理はどのような処理でしょうか。 例として、1000バイトのデータを変数に代入する際、 (1)直接一つずつ代入する。 data[0] = 0x00; data[1] = 0x00; ・・・ data[999] = 0x00 (2)変数の定義時に代入(初期化)を行う。 unsigned char data[1000] = {0x00,0x00,・・・・0x00} 等ありますが、どちらの処理が有効でしょうか。 また、その他有効な処理方法等がありましたら、ご教授願います。 グローバル変数として定義するか、かローカル変数として定義するか、 defineで代入値を持つ等、定義時の方法でも違いがありましたら、 教えて頂けると助かります。

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • PIC18Fで変数の受け渡しが出来ない

    次の環境でPICを動かしているのですが変数の受け渡しが出来ません。 お心当たりがありましたらご教授いただけないでしょうか。 現象 int val1,Val2; : val1 = 1;・・・・・(1) val2 = val1;・・・・(2) ※(1)ではval1に1が正しく入ります ※(2)でval2にval1の値(1)が正しく入りません ※(2)を「val2 = 1;」とするとval2に1が正しく入ります ※longや関数の戻り値「val=func();」なども(2)と同様に正しく入りません CPU:PIC18F66J15 コンパイラ:CCS ライター:MPLAB ICD2

  • 引数(配列)について

    呼ぶ側: Sub main()  Call func(test(),test_id) end Sub 呼ばれる側:  Private Sub func(Byref test() as string, Byval test_id as long) と言う関係がある場合で 引数(1)test() の値がなく渡したくない場合は、どのように記述すればいいのでしょうか? 引数(2)test_id の値がなく渡したくない場合は、0を渡しています  また、呼ぶ側で test() を宣言し、tast()=""を代入すれば問題ないことは分かっているのですが、test()の変数宣言せずに何とかなりませんでしょうか? 宜しくお願いいたします

  • C言語の基本的な質問ですが、関数へのポインタの宣言

    関数へのポインタの質問です。 下のように、関数へのポインタを使ったプログラムを書きました。 (関数へのポインタを理解するためのものなので、実用的な意味はありません。(*^_^*) また、このプログラムはコンパイルもリンクも実行も問題なく出来ます。) #include <stdio.h> int add_func(int,int); (*func_p0) (int,int); int main(void) { int (*func_p1) (int,int); int (*func_p2) ( ); int hoge0,hoge1,hoge2; func_p0=add_func; hoge0=func_p0(3,5); printf("0 : 3+5は%d\n",hoge0); func_p1=add_func; hoge1=func_p1(3,5); printf("1 : 3+5は%d\n",hoge1); func_p2=add_func; hoge2=func_p2(3,5); printf("2 : 3+5は%d\n",hoge2); return(0); } int add_func(int x, int y) { return(x+y); } func_p0のように戻り値の型を書かない場合と、func_p1やfunc_p2のように戻り値の型を書くのとでは何が違うのでしょうか。 func_p0は外部変数ですが、自動変数にする(main関数の中で同様に宣言。)とコンパイルエラーになります。 それはなぜですか。 func_p1のように引数の型が書いてあるのと、func_p2のように引数の型が書いていないのでは何が違うのでしょうか。 int (*func_p2) ( );というのは、int (*func_p2) (void);とは違うんですよね?

  • charで宣言した変数をstringへの代入で

    wchar_t cOrg[128]と宣言している変数にstringで宣言しているstrを cOrg[i] = str[i]; このように代入することはできたのですが、 char cAns[ 128 ]; このように宣言した変数の値をstrの41番目と42番目に 次のように入れようとするとエラーが出ます。 str[41]=cAns[1]; str[42]=cAns[2]; (エラー内容) \Form1.h(428): error C2664: 'System::String::String(wchar_t,int)' : 1 番目の引数を 'wchar_t [128]' から 'wchar_t' に変換できません。(新しい機能 ; ヘルプを参照) このような代入はできないのでしょうか? プログラムの詳細は下のようなものです。 wchar_t cOrg[128],*p; String^ str; String^ str2; int i; int iVal1,iVal2,iTotal = 0,iHosu; char cAns[ 128 ]; str = this->textBox1->Text; for(i=0;i<41;i++) { cOrg[i] = str[i]; } -------(中略)------------------------------------------ iHosu = ~iTotal; // 1の補数 iHosu++; // +1 iHosu = iHosu & 0x00FF; sprintf( cAns, "%s%02X%c", cOrg, iHosu, 0x22 ); str[41]=cAns[1]; str[42]=cAns[2];

  • 文字列→数値変換関数

    ・数字文字列を数値化する関数AtoS()を制作する。 書式:short AtoS(char *pStr, int *pRetCode); 引数:char *pStr; 文字列の先頭アドレス    int *pRetCode; 動作の正否を返す 戻り値:pStrを数値化した値 処理: pStrで与えられた文字列をshort型に変換する。 呼び出し側の書式は以下の通りです。 void main(void) {  short val; int code; val = AtoS("1234", & code); printf("%d\n",val); val = AtoS("-789", & code); printf("%d\n", val); } です。専門学校の明日の朝までの課題なのでどうか、どなたか助けて下さい。 

  • C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からず

    C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からずに困っています。 C言語ラストの問題が一番難しくて、全然分からずに困っています。 以下の点に留意して、一辺の長さを入力すると、正方形の面積と直方体の体積を計算するプログラムを作成する。main内 1)整数型の変数length、men、taiを宣言する。 2)実行例と同様の表示になるように、“一辺の長さを入力してください。”を表示し、入力された値を、変数lengthに読み込む。 3)作成する関数名は、titleとし、lengthを引数とし、関数titleを使う。 4)正方形の面積を計算する関数の関数名は、squareとし、lengthを引数とし、戻り値をmen に代入する。 5)直方体の体積を計算する関数の関数名は、qubeとし、lengthを引数とし、戻り値をtai に代入する。 6)“一辺○○の正方形の面積は ○○です。”と表示する。 7)“一辺○○の直方体の体積は ○○です。”と表示する。 関数title内 1)引数を変数名xとする。 2)下記の実行例の様になるように、表示を行う。 関数square内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)正方形の面積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 関数qube内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)直方体の体積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 という問題です。 考えて作ってみたのが下のですが、間違いだらけでどうしようもありません。 #include <stdio.h> void main(void) { int length,men,tai; printf("一辺の長さを入力してください。\n"); scanf("%d",&length); men=square(length); tai=qube(length); printf("***********************************\n"); printf("* 一辺%d *,&lenght); printf("*正方形の面積*") printf("*直方体の体積*") printf("*を計算します。*") printf("*************************\n"); } int square(x) { int val; val=x*x; return val; } int qube(y) { int val; val=x*x*x return val; } どなたかよかったら教えてください。 よろしくお願いします。

専門家に質問してみよう