• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複雑なキャスト)

複雑なキャストの書き方は?

このQ&Aのポイント
  • (int の要素数3の配列) へのポインタを意味するキャストの書き方を教えてください。
  • コンパイルエラーが発生する理由も教えてください。
  • 先頭要素のポインタを経由して、要素数3の配列へのポインタを表現する書き方が分かりません。

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

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

ああそうそう, 「どう書けばいいか」は, その型の変数が宣言できる人ならわかるはずです. たとえば今の例の「int の大きさ 3 の配列へのポインタ」だったら int (*pai)[3] って書いてるでしょ? そこから識別子の pai を消せばいい. それだけ. typedef 使えばいいのに, って話もあるな.

kc1210yone
質問者

お礼

変数名を抜けばいいだけなんですね ありがとうございます

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

その他の回答 (3)

  • chie65535
  • ベストアンサー率43% (8536/19405)
回答No.4

因みに、C言語では、配列もポインタも同じ物なので #include<stdio.h> int func(int *pai, int n){ return pai[n]; } int main(){ int ai[] = {0, 1, 2}; int i = func(ai, 1); int *pi = ai; int j = func(pi, 1); printf("Of course %d = %d.\n", i, j); return 0; } で良い。この方がコードが短くなるし速くなる。

kc1210yone
質問者

お礼

ありがとうございます!

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

int j = func((int*[3])pi, 1); ↓ int j = func((int(*)[3])pi, 1); funcの宣言の所には int func(int (*pai)[3], int n) って感じで「int (*pai)[3]」って書いてあるよね?ここから「変数名のpai」を削って、前後を括弧で括れば「キャスト」になる int (*pai)[3] ↓ int (*)[3] ↓ (int (*)[3])

kc1210yone
質問者

お礼

ただ変数名を抜けばよかったんですね ありがとうございます

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

(int (*)[3])

kc1210yone
質問者

お礼

括弧かー、なるほど!

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

関連するQ&A

  • 引数で指定された配列の要素数の取得

    どうもこんにちは。 C言語でプログラムを作成しています。 ある関数に配列を渡すことを考えていますが、渡した配列の要素数を取得する方法は何かありますか? 標準の関数を見ても、配列の先頭アドレスのポインタとともに、配列の要素数を渡しているものばかりで、配列のポインタを渡しているものは見かけません。 要素数があらかじめわかっていれば、それを引数の型に指定できますが、呼び出されるまで不明な場合はうまくいきません。 配列の要素数も引数として一緒に渡す必要がありますか? [作ってみたサンプル] #include <stdio.h> #include <stdlib.h> #include <string.h> // func1 と func2 をまとめられないだろうか。。。 void func1(int (*p)[10]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } void func2(int (*p)[5]) { ________int n = sizeof(*p) / sizeof((*p)[0]); ________int i; ________for (i = 0; i < n; i++) { ________________printf("%d\n", (*p)[i]); ________} ________printf("\n"); } int main(int argc, char *argv[]) { ________int ary1[10] = { 2, 4, 6, 8, 0, 1, 3, 5, 7, 9 }; ________int ary2[5] = { 3, 6, 9, 12, 15 }; ________func1(&ary1); ________func2(&ary2); ________return 0; }

  • ポインタのキャスト方法

    こんにちは。 C言語でポインタキャストしているところがどうしてもうまくいきません。 以下のような要素数10個の型配列を指すポインタを キャストしたいのですがこれだと警告文がでてしまうので きちんとキャストしたいのですが、 どうしてもうまくいきませんでした。。。 1 short int *ibuf; 2 short int (*ibuf_tmp)[10]; 3 ibuf_tmp=ibuf; ※←ここです 宜しくお願いします。

  • C言語で、他の関数で配列を書き換えられないようにしたい

    下のCのプログラムでは、func関数は配列aの先頭要素へのポインタを返します。 main関数の側では配列aの中身を表示します。 しかし、main関数のfor文の中の★の部分をコメントアウトせずに入れると、この配列の中身が書き換わってしまいます。  私はfunc関数以外では、この配列の中身をいじられたくないのです。  なんとかfunc関数を工夫して作成して、func関数以外では、配列の中身が変わらないようにしたいのですが、どうすればよいでしょうか。    とは言ったものの、多分できないだろうなあ、という気がします。  できないならばできないでも仕方ないのですが、確信が持てないのです。 条件があります。 funcでは表示は行なわない。 配列aの中身を表示できるように、funcから呼び出し元へ、aのアドレスまたはaの先頭要素のアドレスがわかるような情報を返す。 #include <stdio.h> char *func(int i) { static char a[]="AAAA"; a[i]='z'; return a; } int main(void) { int i; for(i=0; i<4; i++) { char *p=func(i); /* p[i]='X'; ★配列の中身を書き換えてしまう。 */ puts(p); } return 0; }

  • プログラムがわかりません

    C言語の本を読んでいるんですが、詰まってしまいました。プログラム自体は単純なのですが #include<stdio.h> void hello(void) { fprintf(stderr,"hello!\n"); } void func(void) { void *buf[10]; static int i; for(i=0;i<10;i++) { buf[i] = hello; } } int main(void) { int buf[100]; func(); return 0; } のスタックオーバーフローのプログラムです。 1. 要素100のint型配列を宣言 2. 関数funcの呼び出し 3. void *buf[10]; まずここでがわかりません。なぜポインタが   でてきたのか?またbufの要素数は100では? 4. buf[i] = hello; のループ    これもわかりません。配列に関数を代入しているのでしょうか?     5.  fprintf(stderr,"hello!\n"); これもまたわかりません。    fprintfの最初の引数は出力先ですが、なぜ標準エラー出力なの   でしょうか? 時間のあるかた解説お願いします。

  • ポインタによる関数への配列渡し

    林晴比古さんの「新C言語入門」でC言語を勉強している初心者です。 現在ポインタの勉強をしています。色々教科書の文例等をポインタで書くとどうなるか試しております。 上書P200練習問題2に「配列の最大値を返す(その際配列の長さを渡す)」プログラムがあり、それをポインタで渡すプログラムに直してみました。 仮引数に「maxdata」を設定し、そのアドレスを関数側に渡し、関数側ではポインタとして受け取る(そうすれば関数側からはreturnで値を返す必要がない)、と考え、下記のように書いてみました。 #include <stdio.h> void max_of_array(int n[], int len, int *ans); int main(void) { int dt[6] = {50,20,80,30,10,40}; int maxdata; max_of_array(dt,6,&maxdata); printf("最大値=%d\n", maxdata); return 0; } void max_of_array(int n[], int len, int *ans) { int i; ans = &n[0]; for (i=1; i<len; i++){ if (*ans < n[i]) *ans = n[i]; } } しかしコンパイルすると、何故か「最大値=1」となってしまいます。(正しくは80です) 他にも色々試してみましたがうまくいかず、かなり考えてみたのですがどうしても分かりません。お分かりの方、どうすれば正しくなるのが教えてください、よろしくお願いします。

  • このプログラムにアドバイスをください

    問題が  ・100個の要素を持った一次元配列をmain()関数内で宣言 ・一次元配列と要素数を引数として持つ関数seisei() ・関数seisei()は乱数を使い渡された配列を0~99の整数で初期化する。 ・一次元配列、要素数そして変数のポインタを引数としてもつ関数goukei() ・関数goukei()は渡された配列に格納された数値の合計を計算し、渡された変数のポインタにその合計値を代入する。 と問題があり、下記のようにプログラムを作ったんですが、どうしてもコンパイルできません。どなたかご指摘よろしくお願いします。 #include <stdio.h> #include <time.h> void seisei(int *,int); void goukei(int *, int, int*); int i, *sum; int main() { int a[100],sum; seisei(a,100); goukei(a,100,&sum); printf("sum:%d\n",&sum); return 0; } void seisei(int *a[i], int n) { srand(time(NULL)); for(i = 0; i <= n; i++){ *a[i] = rand() % 100; } } void goukei(int *a[i],int n,int *sum) { *sum = 0; for(i = 0; i <= n; i++){ *sum += *a[i]; } }

  • C言語 動的なメモリの確保 コンパイル時エラーも警告もないのに実行できない

    配列A[3]を{2, 4, 6}と初期化させ、malloc関数を使いメモリを確保しそこへ先程の配列Aの要素を記憶させ、ポインタ*Nを使い確保したメモリの要素を表示するプログラムです。 ********************************************* #include <stdio.h> #include <stdlib.h> int main(void) {   int A[3] = {2, 4, 6};   int i;   int *N;   N = (int *) malloc (3);   for(i = 0; i < 3; i++){     N[i]= A[i];   }   for(i = 0; i < 3; i++){     printf("%d", N[i]);   }   free(N);   return 0; } ********************************************* VCを使いF10のデバッグテストでは正常に動くのですが、コマンドラインからではエラー報告画面がでます。なぜなのでしょうか?

  • 複雑なポインタの定義

    #include <stdio.h> typedef int *(*i[3])[2]; int main() { int a = 0; int b = 1; int c = 2; int d = 3; int e = 4; int f = 5; int *u[2] = {&a, &b}; int *v[2] = {&c, &d]; int *w[2] = {&e, &f}; int **pp[3] = {u, v, w}; /* arrayをi型(intへのポインタを要素とする2個の配列へのポインタを要素とする3個の配列)として宣言 */ i array; /* この部分でarrayを使って変数a~fの内容を表示したい */ } 上記の最後の部分で、typedefで定義したi型の変数arrayを使って、変数a~fの内容を表示させたいのですが、その上で定義している諸々の変数との型の不整合が起こって、どういう記述をしたらよいか分かりかねています。要は、複雑なポインタの型定義をした場合の使い方がよく分からないのです。 御経験のある方は、御教示願えれば助かります。

  • **a と a*[]

    func(int **a) と func(int *a[]) は同じですか? int型配列 a[5] のアドレスを func() の引数で受ける場合、 func(int *a[5]) のように要素数を指定すると どう変わりますか?

  • 動いているのに…

    学校の課題で、 ランダム関数を使って、 πの近似値を求めようという課題が出されました。 そして、私は、 #include<stdio.h> #include<stdlib.h> double pai_calc(int n);//乱数を発生させて、近似値と求める int main(void){ int i,n;//nは発生させる乱数の数 for(i=0;i<=5;i++){ if(i==0) n=10; else if(i==1) n=100; else if(i==2) n=1000; else if(i==3) n=2000; else if(i==4) n=5000; else n=10000; printf("pai approx.[%d]=%f\n",n,pai_calc(n)); } return(0); } double pai_calc(int n){ double rndx,rndy,pai,m=0; int i; for(i=1;i<=n;i++){ rndx=(float)rand()/32768.0;//1以下の少数を発生させる rndy=(float)rand()/32768.0; if((rndx*rndx+rndy*rndy)<=1) m++; } pai=4*m/n; return(pai);} このように作って、結果も pai approx.[10]=3.200000 pai approx.[100]=3.280000 pai approx.[1000]=3.148000 pai approx.[2000]=3.148000 pai approx.[5000]=3.120800 pai approx.[10000]=3.139600 となったのですが、 先生のPC上では、 pai approx.[10]=0.000000 pai approx.[100]=0.000000 pai approx.[1000]=0.000000 pai approx.[2000]=0.000000 pai approx.[5000]=0.000000 pai approx.[10000]=0.000000 となるそうです。 (つまり失格とのこと) 私のパソコンでは、それぞれ近似値がでたのに、 どうしてでしょうか?? 理解できません。 また、1以下の少数を発生させるのに、 マジックナンバー32768.0を使うな といわれましたが、これを他の方法で置き換えることが できません。 初心者で、まことに申し訳ございませんが、 ご教授ください。