[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 12/28 00:11 / Filesize : 251 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C言語なら俺に聞け(入門篇) Part 20



1 名前:デフォルトの名無しさん mailto:sage [2007/10/15(月) 22:34:33 ]
C言語の入門者向け解説スレです。
・C++言語はスレ違いです。
・分からない事をなるべく詳しく書いて下さい。
・ソースコードを晒すと答えやすくなるかもしれません。
・質問者は最初にその質問をした時のレス番号を名前欄に書いて下さい。

前スレ
C言語なら俺に聞け(入門篇) Part 19
pc11.2ch.net/test/read.cgi/tech/1190342593/

教えて欲しいのではなく丸投げしたいならこちらへ
C/C++の宿題を片付けます 97代目
pc11.2ch.net/test/read.cgi/tech/1191937213/

596 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 15:57:52 ]
struct point {
int x, y;
};
struct point p;
struct point *pp = &p;
があったとき、

(*pp).x = 1;
pp->x = 1;

が同じxに代入をしている。
構造体へのポインタを使う上での簡略化。

597 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 16:00:59 ]
>>595>>596
ありがとうございました

598 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 17:29:44 ]
使ってる教科書に載ってないのか?

599 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:46:39 ]
検索エンジンを作ろうとおもう。
まずEUC-JPに統一する。
旧字体は新字体、カタカナはひらがなにする。
ひらがなと、新字体以外は登録しない。
出現可能な文字に0から順に番号をつけて、N-germ (2-germ) で登録していく
あと、ハッシュを使う為に全角2文字分を圧縮して20数ビットを使う

NKF32.DLL
www.vector.co.jp/soft/win95/util/se295331.html

旧字体→新字体
www.ritsumei.ac.jp/acd/cg/lt/cl/koten/newold.htm
yasuda.homeip.net/misima/misima_seiji_test.html
www.toyama-cmt.ac.jp/~kanagawa/language/kyuuji.html
www.asahi-net.or.jp/~ax2s-kmtn/ref/old_chara.html
homepage3.nifty.com/jgrammar/ja/tools/tradkan0.htm
homepage3.nifty.com/jgrammar/ja/tools/ksimple.htm

600 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:56:23 ]
連載:検索エンジンを作る|gihyo.jp
gihyo.jp/dev/serial/01/make-findspot

Googleの技術は凄いと思ったがMooterっていうサイトがGoogleを上回る検索力らしい
Mooter
www.mooter.co.jp/
辞書不要の形態素解析エンジン「マリモ」とは
www.atmarkit.co.jp/news/200708/15/mooter.html
形態素解析について
www.gengokk.co.jp/thebun.htm
mecab.sourceforge.net/feature.html
Google の秘密 - PageRank 徹底解説
www.kusastro.kyoto-u.ac.jp/~baba/wais/pagerank.html
PageRankの基本概念
tnt.math.metro-u.ac.jp/labo/grad/2004/masa/graph/6.html

601 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 19:58:27 ]
>>599
ガンバレ
そしてこのスレに来るな

602 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:36:04 ]
「関数へのポインタ」は何に使うの?必要(あると便利)な状況がよくわからない。

603 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:42 ]
qsort関数がもろに関数ポインタ使用してるじゃないか

604 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:39:56 ]
qsort



605 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:41:46 ]
ある関数を呼ぶときに、呼ばれた関数内部で使う関数を外から指定するときに使います。
このばあい、関数へのポインターを引数で渡します。

例)
コールバック関数
リストに要素をつなげるときに大小比較関数


606 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:44:33 ]
qsort関数もそうですね

void qsort(void *base, size_t num, size_t size,
int (*compare)(const void*, const void*))

この、int (*compare)(const void*, const void*)が関数ポインターで
この場合はソートの並びを呼び出し側で制御できるようにしている。


607 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:56:19 ]
うーむ、わかったようでわからない。
複数の機能(=関数の数)を内包する関数で、引数の指定によって機能を使い分ける場合ってことかな?
でもそれって単なる文字列でも振り分け可能な気がするなぁ…やっぱりわからん。

608 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 22:59:49 ]
たとえばqsortの場合、qsortの作者が想定してない型のソートもできる

単に引数で文字列を渡すだけじゃ、qsortの作者が想定している型やソート方法しか対応できない


609 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:03:25 ]
>>607
ためしに qsort を使ってみろ
数値のソート、文字列のソート、自前構造体のソート・・・
そしたらわかる

610 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:04:51 ]
ソート機能を提供するけど、その時必要となる比較の機能は自分で作ってね ってこと
一人で作業する分にはあまり使う必要無いと思う

611 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:35:24 ]
比較関数はプログラマ側が用意できるので、昇順や降順、どの値を比較対象とするか等を任意に作れる。
そしてどんな比較関数でも同じ手続きで利用するために、関数へのポインタを使っている。

…で合ってる?

612 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:37:46 ]
ポインター自体を完全に把握してないんじゃないかね?
あれ覚えるのやっかいだし

613 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:38:33 ]
ソート関数とかわかりずらい STLつかっとけ

614 名前:デフォルトの名無しさん mailto:sage [2007/10/30(火) 23:50:45 ]
ポインタはそんなに分かりづらいとは思わなかったなぁ。
いっぺん練習で、全ての変数をポインタとmallocでコーディングしたらイヤでも理解出来るよ。



615 名前:デフォルトの名無しさん [2007/10/31(水) 00:00:58 ]
EUC-JPコードをファイルから読み込んだとき、char やstringでは何コードで記録されるんですか?
指定できますか?

616 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:29:42 ]
OSは何を使ってるとか、コンパイラは何とかそういう情報も書いておこうぜ

617 名前:プリンがー mailto:aaa [2007/10/31(水) 00:47:58 ]
データa1,a2---,a10及びb1,b2,----b10を読み、積和
S=a1b1+a2b2+-----a10b10を計算せよ。

#include <stdio.h>
int main (void)
{
int i,a[10],b[10];
int S;

for(i=1;i<=10;i++){
scanf("%d",&a[i]);
scanf("%d",&b[i]);

S+=a[i]b[i]
}
printf("積和は%dです。\n",S);
return(0);
}

これであってますか??

618 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:34 ]
>>617
・Sの初期化がされていない。
・a[i]*b[i];

619 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 00:49:35 ]
>>617
>S+=a[i]b[i]
とりあえずコレが間違ってる
*と;が足りない

620 名前:プリンがー mailto:aaa [2007/10/31(水) 01:07:16 ]
>>618>>619
S=0
S+=a[i]*b[i];
ですね。
ありがとです。


621 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 01:12:26 ]
>>620
セミコロン(;)忘れるなよ

622 名前:プリンがー mailto:aaa [2007/10/31(水) 01:31:53 ]
うるせーバーカ

623 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:04:27 ]
かなり初心者です。
unsigned char afo_1,afo_2,afo_3,...afo_n;
とafo_1からafo_nまで宣言したい時はどうしたら良いですか?

624 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:22 ]
>>623
配列じゃダメなの?n=10なら
unsigned char afo[10];

配列の各要素へのアクセスは添字を指定する。
afo[0] = 'a';
afo[1] = 'b';

afo[9] = 'j';



625 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 02:09:30 ]
>>623
全部書くしかない。
配列でいいなら配列使え。

626 名前:623 mailto:sage [2007/10/31(水) 02:15:12 ]
>>624,>>625
nが決まった値では無いので、今の路線は無理ですねー。。
配列で頑張ってみます。夜遅いのにすみません。素早い対応ありがとうございます。

627 名前:627 [2007/10/31(水) 04:16:28 ]
明日提出のレポートのプログラムなのですが
どうしても実行後うまくいきません
簡単なプログラムで
入力された文字を”#”で表すというものですが
指摘お願いします

upsurusuru.hp.infoseek.co.jp/index.html
にアップしましたので怪しいむと思いますが
助けてくださいお願いします
07/10/31(Wed),04:10:07
この時刻にアップしました
拡張子を.cに変更してください
だれかおねがいします

628 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 04:30:05 ]
>>627
うちの環境だとコンパイルできないから確認してないけど、
isalphaとisdigitが逆なんでねーの?

629 名前:Pもかっこわりぃなぁ mailto:sage [2007/10/31(水) 10:42:33 ]
>>627
どうでもいいけど、ABCDEFGHIしKLMNOPQRSTUVWXYZになっている。

630 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:33:38 ]
printfとprintf_Pの違いを教えてください

631 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 13:43:36 ]
printfで数字を表示するときも”123”のように”を使いますか?


632 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:07:34 ]
数値と数字の違いが分からんのか

633 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:20:54 ]
>>631
5点

634 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 14:58:30 ]
キーが押されたら何かアクションを起こすってするにはどうすればいい?

例)
enterを押すと計算をするみたいに
enterキーが押されたっていう結果をどうやって取り込むか教えてください



635 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:09:11 ]
>>631
いいえ
”ではなく"を使いましょう

636 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:21:24 ]
>>634
getchar()でもしておいたら?

637 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 15:28:13 ]
>>634
環境による。つかキーボードドライバの仕様による。

638 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:35:44 ]
>>634
コンソールで?
ウィンドウで?

639 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 16:41:08 ]
ウインドウだってコンソールの一種だろ。


640 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 17:22:57 ]
>>639
>>639
>>639

641 名前:プリンがー mailto:aaa [2007/10/31(水) 17:45:50 ]
>>622
俺の猫かぶりすんなや!

642 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:16:08 ]
OSかかないと困るんだなって今日始めてしった
MS-DOSで実行した場合int型って2バイトづつのメモリじゃん?
でもXP上で実行したらint型だと4バイトづつになって超悩んでた結果、
16ビットマシンと32ビットマシンって事って始めて知ったよ・・・

643 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:23:53 ]
System.arraycopy(コピー元,コピー開始位置,転送先,転送開始位置,要素数)
のJAVAの関数を

memcpy(コピー先,コピー元,, n バイト分)
に置き換えたいのですが

要素数をnバイト分であらわすか、
nバイト分を要素数に変えるにはどうすればいいか教えてください

sizeof(nバイト分)ではダメでした

644 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:24:58 ]
>>643
sizeof(要素)*要素数



645 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:27:05 ]
>sizeof(nバイト分)
その発想は無かったわ

646 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:38:59 ]
>>644
できました!!!!!!!!!!!!!!!!!!!11
すいませんが、何をやっているのか教えていただけませんか?

>>645
バカですいません

647 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:50:11 ]
>>646
sizeof(要素)で1つあたりのバイト数が出る
要素数をかけ算すればn バイト分が求まる。
かけ算は小学校三年生だっけ?

648 名前:デフォルトの名無しさん mailto:sage [2007/10/31(水) 23:55:23 ]
理解できました。

memcpyではあくまでバイトを扱うのであって
要素数分のバイトを3つ目に入れないとダメなわけですね。。。ありがとうございました

649 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 01:53:40 ]
ここのスレのひとはgdbの
使い方完全に理解してるのかな?

関数の中の関数とかどうやって見るの?

650 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 02:03:28 ]
>>640
コンソールって何のことだと思ってんの?

651 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:16:51 ]
unsigned int **pi, i, j;

if ((pi = malloc(sizeof(unsigned int *) * 32)) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}

for (i = 0; i < 32; i++)
{
if ((pi[i] = malloc(sizeof(unsigned int))) == NULL)
{
fputs("しっぱい", stdout);
exit(0);
}
}

for (i = 0; i < 32; i++)
{
fprintf(stdout, "%8u %8u", pi[i], &pi[i][4]);
fputc('\n', stdout);
}

for (i = 0; i < 32; i++) free(pi[i]);
free(pi);
return 0;

pi[i][4] と pi[i + 1][0] のアドレスが一緒になっちゃうんだけど、なんで?

652 名前:650 mailto:sage [2007/11/01(木) 07:26:15 ]
>>651
自己解決しました。バカだなオレ…orz

653 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 07:37:41 ]
>>650
ウィンドウって何のことなの?

654 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:06:05 ]
構造体配列を宣言するとき二次元配列として宣言できますか?

typedef struct bridge{
int a;
int b;
int c;
}DATA;

DATA m[5][5];

こんな感じです。



655 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:09:01 ]
>>654 全然おk

656 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 12:10:10 ]
>>655
すばやいレスありがとうございます。

657 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:21:06 ]
先ほどの654のものですが宣言で以下のようにしましたがうまくいきません。
typedef struct bridge{
int a;
int b;
int c;
}DATA;

DATA m[5][5] = {
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},
{-1,0,0},{0,0,0},{0,0,2},{0,0,0},{-1,0,0},
{-1,0,0},{0,1,5},{0,0,0},{0,1,3},{-1,0,0},
{-1,0,0},{0,0,0},{0,1,2},{0,0,0},{-1,0,0},
{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0},{-1,0,0}
};
構造体を二次元配列で宣言する場合はどのようにすればよいのでしょうか。
アドバイスお願いします。

658 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:32:45 ]
>>657
DATA m[5][5] = {
{{-1, 0, 0}, ...},
...
};

659 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 13:40:09 ]
>>658
本当に申し訳ありません。
単純なミスでしたorz
ありがとうございます。

660 名前:デフォルトの名無しさん [2007/11/01(木) 14:29:42 ]
>>639
CUI || GUI ?

661 名前:デフォルトの名無しさん [2007/11/01(木) 14:57:27 ]
int型の数値をchar型の文字列配列に入れたいんですけどできますか?

662 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:05:21 ]
>>661
char ci[100];
int i = 2007;
sprintf(ci, "%d", i);

663 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:09:29 ]
そういう意味だったのか
さすがエスパー

664 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 15:12:44 ]
>>662
ありがとうございます!



665 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:18:05 ]
>>660
ttp://www.excite.co.jp/dictionary/english_japanese/?search=CONSOLE&match=beginswith&dictionary=NEW_EJJE&block=36319&offset=400

666 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:20:06 ]
>>660
こっちのほうが解りやすいかな。
ttp://www.excite.co.jp/dictionary/japanese/?search=%E3%82%B3%E3%83%B3%E3%82%BD%E3%83%BC%E3%83%AB&match=beginswith&itemid=07660600

667 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 16:25:24 ]
>>665
え?
>>634
のプログラムの話なんだけどなんなの?

668 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 20:52:53 ]
ポインタ意味わかんねええええええええええええええええ
*pだとしたら
p = &a ってアドレスのみ格納?
でこの場合
*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
これでいいのかい!?
でポインタのポインタとかイミフ!

669 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:04:02 ]
>>668
>*pはaの中身そのまま、pならaのアドレスそのまま &pならポインタ変数pのアドレス。
>これでいいのかい!?
まあ大体はおk

>でポインタのポインタとかイミフ!
単純に上のaがポインタだと考えればいいんだよ

670 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 21:33:12 ]
>>669
ソノハッソウハナカッタワ
すげー単純にわかった。thx

671 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:42:44 ]
while(count < 20)
{
  aiai = rand();
  if (aiai >= 0 && aiai <= 100)
  {
    count2 = 0;
    while(count2 < 3)
    {
      test[count][count2] = aiai;
      count2++;
      printf("%4d ",test[count][count2]);
    }
  printf("\n");
  count++;
}

配列二次元目をまず3つ埋めた後、
縦に20個の繰り返しで乱数での数字を埋めたいんだけど、
どーもcount2が機能してないみたいで、全部初期化した0が返ってくる。
なんでなんだぜ?
二次元目って変数指定できないの?

672 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:43:48 ]
あ、ごめん上の見やすくするためにスペース入れてたらifの閉じるの消えちゃってる。
それはご愛嬌で><

673 名前:デフォルトの名無しさん mailto:sage [2007/11/01(木) 22:47:36 ]
ごめんなさい。
よくよく見直したら
      count2++;
      printf("%4d ",test[count][count2]);
これ処理の順番逆でした・・・。

674 名前:プリンがー mailto:aaa [2007/11/02(金) 00:35:43 ]
-
x(エックスバーってどうやったら入力できますか?



675 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 00:36:39 ]
>>674
ja.wikipedia.org/wiki/%E3%82%A8%E3%82%AF%E3%82%B9%E3%82%AB%E3%83%AA%E3%83%90%E3%83%BC

676 名前:デフォルトの名無しさん [2007/11/02(金) 01:12:30 ]
プログラム初心者です。
乱数のrand()を使って勝、負のとこを帰れば丁、半にかえるプログラムですが
これで問題はないでしょうか?

#include <stdlib.h>
main(){
int a;
a= rand() % 2;
if(a==1){
printf("勝");
}else{
printf("負");
}
}

プログラムの意味でifは基本なのでわかりますが

↓ここの部分があまりよく分からないんですが
a= rand() % 2;
if(a==1){
%2は2つの数のどちらかを出すと考えたのですがそれでよろしいでしょうか?
a==1のとき勝が表示されます。
a= rand() % 2で1が表示された場合
elseはa==0ということで負と表示されていると考えていのでしょうか?

応用として甲、乙、丙をランダムに表示させる場合はif(a==2)、else if(a==1)、else
として甲、乙、丙を表示させると考えるとかんがえていいのでしょうか?

分かる方がいればよろしくお願いします。
初心者用の参考書には乱数関係の説明がほとんどないんで…。


677 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:14:18 ]
乱数の説明はなくても%の説明がない参考書はないだろ。

678 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:15:57 ]
#include <stdio.h>
int main(void)
{
while(1)
{
float kyori;
int ryokin;
printf("距離?"); scanf("%f", &kyori);
if(kyori <= 0.0) return;
  for(ryokin = 1300; kyori > 8.0; kyori -= 2.0) ryokin += 200;
if(kyori <= 5.0) ryokin = 870;
if(kyori <= 3.0) ryokin = 550;
if(kyori <= 2.0) ryokin = 380;
printf("料金 : %d\n", ryokin);
}
}

↑のプログラミングリストでfloatの型使わないで表すとどうなるでしょうか?
お願いします

679 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:19:40 ]
宿題スレで聞け

680 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 01:28:03 ]
>>676
rand()は0以上RAND_MAX以下の整数を返す関数
%2は2で割った余り(剰余)を求める
2で割った余りは0か1だからrand()%2は0か1どちらかをランダムに生成するという意味
甲乙丙なら3種類の乱数(0,1,2)をランダムに生成すればいいからrand()%3とすればいい

681 名前:デフォルトの名無しさん [2007/11/02(金) 06:18:49 ]
>676より

>680
ありがとう。
rand()%◆では◆で割った余りをランダムに表示させるという方法で
乱数をだしているんですね。

>677
それは分かるんです。質問の仕方が悪かったようで申し訳ないです。


682 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:10:23 ]
表示

683 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 10:50:31 ]
char *const p;
char *const *pp = &p;

pp = foo // 可能?
*pp = bar // 可能?

char *const *ppとあるとき、

*constと*はどっちが元のもの?
ポインタのポインタのポインタの…は、
どっち方向に * が伸びていくの?

684 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:18:41 ]
>>683
fooとbarは何の型?



685 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:29:03 ]
char c;
char *const p = &c;
char *const *pp = &p;
char *const **ppp = &pp;
char *const ***pppp = &ppp;

pp = foo; // 可能
*pp = bar; // 不可能
**pp = hoge; // 可能

686 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 12:41:26 ]
char *const *pp
はconstなchar* のポインタ

char const **pp
はconstなcharのポインタのポインタ

と認識してるけど・・・

char *const p;
char *const *pp = &p; //OK

char const *p;
char *const *pp = &p; //NG


687 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:14:02 ]
char *const *pp

charへのconstポインタへのポインタ?
charへのポインタへのconstポインタ?

char **const p

charへのconstポインタへのconstポインタ?
charへのポインタへのconstポインタ?(char *(*const) p相当?)

688 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:15:29 ]
>>685 さんの説(?)で行くと、

char *const *pp
はcharへのconstポインタへのポインタ、ということになる。

689 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 14:17:26 ]
>char *const *pp 
charへのconstポインタへのポインタ

>char **const p
charへのポインタへのconstポインタ

>charへのconstポインタへのconstポインタ? 
それは char *const *const p; と書く

690 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 15:58:45 ]
おまえらはオレの脳を破壊する気ですか?

691 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:28:04 ]
>>683-が一切わからん

692 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:50:59 ]
要するにconstあり/なしの組み合わせの数がたくさんあるってこと。
ポインタじゃないただの変数の場合、constあり/なしの2種類しかない。

char c;
const char c;

ポインタには、指す先のconstあり/なしとポインタ自体のconstあり/なしがあるから、全部で4通りになる。

charへのポインタ … char *p;
charへのconstポインタ … char *const p;
const charへのポインタ … const char *p;
const charへのconstポインタ … const char *const p;

ポインタを指すポインタは、指す先が4種類あって、ポインタ自体のconstあり/なしもあるから、全部で8通り。

charへのポインタ へのポインタ … char **p;
charへのconstポインタ へのポインタ … char *const *p;
const charへのポインタ へのポインタ … const char **p;
const charへのconstポインタ へのポインタ … const char *const *p;

charへのポインタ へのconstポインタ … char **const p;
charへのconstポインタ へのconstポインタ … char *const *const p;
const charへのポインタ へのconstポインタ … const char **const p;
const charへのconstポインタ へのconstポインタ … const char *const *const p;

693 名前:デフォルトの名無しさん [2007/11/02(金) 17:53:33 ]
もうやめて>>692>>690-691のライフは0よ!

694 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 17:56:01 ]
>>692 まとめおつ!!



695 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:01:20 ]
「ポインタ完全制覇」だっけかに考え方が書いてあるよ

const char **const p;
の場合、右から順に考えて
p が const
*p はノーマル
**p が const
という風に機械的に解釈するといいらしい

696 名前:デフォルトの名無しさん mailto:sage [2007/11/02(金) 18:03:18 ]
どうせコンパイラも機械的に解釈してるしな






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<251KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef