約 3,884,379 件
https://w.atwiki.jp/gamexprogram/pages/42.html
C言語 ポインタ2 2回目は、関数を使ってポインタを説明します。 例文 //================================================ //include //================================================ #include stdio.h //================================================ //struct //================================================ struct tagChara { int attack;//攻撃力 int defence;//防御力 }; //================================================ //関数のプロトタイプ宣言 //================================================ void SetStatus(int *attack, int *defence);//ステータスセット //================================================ //メイン関数 //================================================ int main(void) { struct tagChara player; /*ステータスセット*/ SetStatus( player.attack, player.defence); printf("攻撃力 %d\t", player.attack); printf("防御力 %d", player.defence); return 0; } //================================================ //ステータスセット //================================================ void SetStatus(int *attack, int *defence) { printf("攻撃力を入力せよ"); scanf("%d", attack); printf("防御力を入力せよ"); scanf("%d", defence); } 実行結果 解説 void SetStatus(int *attack, int *defence); 引数がポインタの関数のプロトタイプ宣言をしています。 こうしないと、正確な値が出ません(確認済) SetStatus( player.attack, player.defence); 関数の使用です。 ポインタを参照するため、 をつけてください。 scanf("%d", attack); このscanfですが、少し違うところがあります。 それは がついていないところです。 これは、前回のポインタの説明に関係してきます。 前回 ポインタ 数値 *を前につける アドレス 何も付けない と書いたと思います。 その関係で、アドレスを参照するときには何もいらないのです。 C言語に戻る
https://w.atwiki.jp/gamexprogram/pages/43.html
C言語 ポインタ3 3回目は、構造体を使ってポインタを説明します。 例文 //================================================ //include //================================================ #include stdio.h //================================================ //define //================================================ #define P_AT 4 //自分の攻撃力 #define P_DEF 2//自分の防御力 #define E_AT 2//敵の攻撃力 #define E_DEF 1//敵の防御力 //================================================ //struct //================================================ struct tagChara { char *name;//名前 int attack;//攻撃力 int defence;//防御力 }; //================================================ //関数のプロトタイプ宣言 //================================================ void SetStatus(struct tagChara *chara, char *name, int attack, int defence);//ステータスのセット void DispStatus(struct tagChara *chara);//ステータスの表示 //================================================ //メイン関数 //================================================ int main(void) { /*構造体変数の宣言*/ struct tagChara player; struct tagChara enemy; /*ステータスセット*/ SetStatus( player, "勇者", P_AT, P_DEF); SetStatus( enemy, "モンスター", E_AT, E_DEF); /*ステータスの表示*/ DispStatus( player); DispStatus( enemy); return 0; } //================================================ //ステータスセット //================================================ void SetStatus(struct tagChara *chara, char *name, int attack, int defence) { chara- name = name; chara- attack = attack; chara- defence = defence; } //=============================================== //ステータスの表示 //=============================================== void DispStatus(struct tagChara *chara) { printf("%s \t", chara- name); printf("attack %d\t", chara- attack); printf("defence %d\n", chara- defence); } 実行結果 解説 void SetStatus(struct tagChara *chara, char *name, int attack, int defence);//ステータスのセット 構造体をポインタにして、関数のプロトタイプ宣言をしています。 SetStatus( player, "勇者", P_AT, P_DEF); ステータスの設定をしています。 SetStatusの最初の引数は、構造体のポインタのため、 をつけています。 では実際に、関数の中身を見て行きましょう。 chara- name = name; chara- attack = attack; chara- defence = defence; 構造体ポインタの変数に、引数として指定したもの を代入しています。 構造体ポインタを代入するときは、上記の通り をつけるか、 (*chara).nameという風にします。 DispStatusも同じような感じです。 とりあえず、ポインタの回は以上です。 大変複雑で難しいですが、一度使い方さえ 抑えてしまえば、何とかなると思います。 C言語に戻る
https://w.atwiki.jp/nopu/pages/184.html
ポリモーフィズムも参照 関数ポインタ // 宣言 double (*func) (double, double) // 代入 func = add; // 使い方(2通り) cout func(1.0, 2.0); cout (*func)(3.0, 4.0); // 関数に渡す subroutine( func, 5 ); // 関数ポインタを引数にとる関数の宣言 void subroutine( double (*func)(double, double), int num ) 引数の数があわないときに,関数ポインタが使いたい。 ポリモーフィズムを参照 ストラテジーパターンに持ち込むのが正解ぽい。
https://w.atwiki.jp/emerald-device/pages/22.html
命令ポインタとは IP(インストラクションポインタ)レジスタのことです。 IPレジスタは現在実行中のプログラムのアドレスを示します。 使用するには -T=[開始アドレス] [実行する命令数] と指定します。 このプログラムではアドレス 0100 から2つの命令を実行しています。 結果からIPレジスタが次々に移っていく様子が分かる。 IPレジスタは実行中のアドレスを示すレジスタでプログラマが変更することはできない。
https://w.atwiki.jp/bokuyo/pages/95.html
関数ポインタ 誰でも編集できるようにしたから誰でも編集していいよ。 関数ポインタって? 変数はどこに格納されているかというアドレスを持っている。 関数も同様に、メモリ上のどこに格納されているか、というアドレスを持っている。 関数の実行開始する場所をエントリーポイントと呼んでるとかなんとか。main()関数のことを、プログラムの実行開始する場所って意味でエントリーポイントっていうよね。 コメント 名前 コメント
https://w.atwiki.jp/boujyutsuki/pages/112.html
防術機に関するマウスポインタを投げるところです。 RE LOADポインタ
https://w.atwiki.jp/air-lang/pages/53.html
(事前定義済みの)ファイルポインタ 名前 別名 意味 STDIN stdin 標準入力 STDOUT stdout 標準出力 STDERR stderr 標準エラー出力 DATA data スクリプトプログラム内の埋め込みデータ読み込み用 ※ ※スクリプトプログラム内に埋め込みデータが存在する時のみ有効。それ以外は無効(未定義)。 埋め込みデータの開始は __DATA__ __data__ D[ATA] d[ata] のいずれかで指定する。 ans=0 while(str=gets(DATA)){ # __DATA__ 以降を1行ずつ読み込み、変数 str に代入します。 ans+=int(str) # その内容を整数に変換して変数 ans に加算します。 } print("Answer=%d\n",ans) # Answer=603 が表示されます。 __DATA__ 100 200 303 (一般ファイルの)ファイルポインタ ファイル名(の文字列)を保持する変数を、ファイルポインタと見なしてファイルI/Oを実行して下さい。 正確な(内部的な)ファイルポインタの取扱いは、以下の通りです。 最初のファイルI/O実行時には、対象ファイルが自動的にオープンされ、オープンされたファイルポインタが元の変数の専用領域にセットされます。そして、そのファイルポインタを用いて最初のファイルI/Oが実行されます。 2回目以降は、元の変数が既に持っている(オープン状態にある)ファイルポインタを用いてファイルI/Oが実行されます。 fname="/etc/passwd" # ファイル名を文字列で変数 fname にセットします。 while(str=gets(fname)){ # 対象ファイルをオープンし1行ずつ読み込み変数 str に代入します。 puts(str) # その内容を表示します。 }
https://w.atwiki.jp/sevenlives/pages/1789.html
NULLポインタ 読み:ぬるぽいんた, なるぽいんた 英語:null pointer 別名: 意味: NULLポインタとは、どのアドレスも指していないポインタのこと。 いかなるポインタと比較しても等しくなりません。 値は処理系によって0やランダムな値が設定されています。 2009年11月16日 NULL
https://w.atwiki.jp/tetdm/pages/24.html
配列の配列変数をポインタ変数に代入する #include stdio.h main() { int iary[] = {1,2,3}; int *ip; ip = iary; printf("配列変数で見ると %d\nポインタ変数で見ると %d\n",iary[0],*ip); } ポインタ変数の加算 #include stdio.h main() { int iary[] = {1,2,3}; int *ip; ip = iary; ip = ip + 2;//ポインタ変数の加算 //ポインタ変数の指すアドレスの値を見る printf("配列の先頭 %d\n加算したポインタ変数で見ると %d\n",iary[0],*ip); //ポインタ変数の値(アドレス)を見る printf("0番目のアドレス %p\n1番目のアドレス %p\n\ 2番目のアドレス %p\n加算されたポインタ変数の値は %p\n" , iary[0], iary[1], iary[2],ip); } 演習 double型の配列を代入したポインタ変数の加算の様子を調べよ char型の配列を代入したポインタ変数の加算の様子を調べよ 配列の先頭アドレスが代入されているポンタ変数ipを用いて*(ip+1)は,何を意味するか調べよ 型の違うポインタ変数に代入すると #include stdio.h main() { unsigned int iary[] = {100,101,102}; char *ip; ip = iary; //ip = ip + 1; printf("%p, %p, %c\n",iary,ip,*ip); }
https://w.atwiki.jp/oboegaki_c/pages/16.html
まず、ポインタとは何か。。。 説明する前に、PCの構造を理解しないといけません。 C言語では関数を宣言するとPCのメモリ上に 関数が存在する場所を確保します。 同じように、変数を関数の中で宣言すると、 変数が存在する場所をメモリ上に確保します。 それぞれがメモリ上にある場所を確保すると、今度はその場所の中に 文字列やら、数字やらを入れていくわけですが、、、 関数間で大きなデータをやり取りすると、どうしても 関数の中でそれぞれの変数を宣言することになり、 メモリを大きく消費してしまいます。 そこで、大きな変数をやり取りする際には、 それぞれの変数がどこにあるかを把握し、 その場所を関数間でやり取りをしてあげると、 使うメモリの量は極端に少なくなります。 。。。前置きはこのくらいにして、 今回もソースを見て行きましょう。。。 と、そのまえに、次のようなtxtファイルを、 ソースのあるディレクトリ(フォルダ)に[test2.txt]って名前をつけて用意しておいてください。 inoue,30,さいたま市 。。。一行でいいです。 お好みに応じて追加してもいいですけど。 それでは、ここからソースになります。 #include stdio.h #include string.h #include stdlib.h int hyouzi(char* buff); typedef struct{ int age; char name[20]; char adr [20]; } add; int main() { FILE *fp; char a[20]; char buff[20]; memset(buff, \0 ,sizeof(buff)); memset(a, \0 ,sizeof(a)); fp=fopen("test2.txt","r"); if(fp==NULL) { printf("ファイルが開けませんでした。\n"); return 1; } fgets(a,sizeof(a),fp); strncpy(buff,a,strlen(a)-1); hyouzi(buff); close(fp); return 0; } int hyouzi(char* buff) { add add1; char a[20]; char agen[20]; char pt[20]; char pt2[20]; char *pa; memset( add1, \0 ,sizeof(add1)); memset(agen, \0 ,sizeof(agen)); memset(pt, \0 ,sizeof(pt)); memset(pt2, \0 ,sizeof(pt2)); pa = strchr(buff, , ); strcpy(pt,pa); strncpy(add1.name,buff,strlen(buff)-strlen(pt)); printf("name=%s\n",add1.name); memset(pt, \0 ,sizeof(pt)); strcpy(pt,pa+1); pa=strchr(pt, , ); strcpy(pt2,pa); strncpy(agen,pt,strlen(pt)-strlen(pt2)); add1.age=atoi(agen); /* 使ってみたかっただけ */ printf("age=%d\n",add1.age); strcpy(add1.adr,pt2+1); printf("adr=%s\n",add1.adr); return 0; } まずは全体の説明を。。 main関数ではファイルを読み込み、 読み込んだ情報を hyouzi関数に渡しています。 hyouzi関数では、わたされた情報から、必要な部分を切り出して わかりやすいように表示をしています。 表示が終わるとmain関数に処理成功を通知して、 main関数がファイルを閉じます。 次は細かく各箇所を見ていきましょう。 まずは、 int hyouzi(char* buff); 関数宣言時にchar型のアドレス(ポインタ)を引数として宣言します。 これで、現物ではなくて、ポインタで関数間の変数のやり取りが出来ます。 hyouzi関数ではbuffの中身をいじります。。。ということですね。 次は、 FILE *fp; 今回のようにファイルの入出力時には、 必ずファイルのポインタを宣言してあげなければなりません。 そこにファイルの中身をはりつけて使えるようにするのです。 そして、 char buff[20]; これを今回は関数間で渡して、中身をhyouzi関数でいじります。 。。。あれ???って思った人。。。鋭いです。 char buff[20]; は実体で、 char* buff はポインタになります。 ポインタは大きさを宣言しません。 なぜなら、ポインタはその変数が メモリ上のどこにあるかを示すだけの変数であり、 大きさはまったく見ていないからです。 ためしに、このソースのどこかに printf("sizeof(buff)=%d\n",sizeof(buff)); と、一文加えてポインタのサイズを表示してみてください。 もっと時間のある人は、hyouzi関数内で printf("sizeof(add- age)=%d\n",sizeof(add- age)); と加えて、int型のポインタとchar型のポインタは大きさに何も変化がないことを 確認してください。 では、int型のポインタと、char型のポインタは何が違うのでしょう。 答えは、「動き」です。 ためしに、hyouzi関数に以下の部分と追加してみてください。 printf("char* buff=[%d]\n",buff); printf("char* buff +1=[%d]\n",buff+1); printf("add1- age=[%d]\n", add1.age); printf("add1- age+1=[%d]\n", add1.age+1); すると、char型のポインタとint型のポインタでは、 明らかに数字の増え方が違うと思います。 実は 「ポインタに 1 加える」ということは 「ポインタに格納されているアドレス + 1番地」ではなく 「ポインタに格納されているアドレス + 型のサイズ」 ということになります。 つまり、同じ「++p」でも char型なら サイズ 1バイトなので 1番地 int型なら サイズ 2バイトなので 2番地 long型なら サイズ 4バイトなので 4番地 float型なら サイズ 4バイトなので 4番地 double型なら サイズ 8バイトなので 8番地 構造体ならその構造体分だけ アドレスが増えることになります。 。。。ここまで説明すると、 後はヘッダ&標準関数表を見ながら このソースが解読できると思います。 どうでしょうか。。。ここまでくれば後は慣れです。 がんがんソースを書くしかないと思います。 わからないことはbbsに書き込んでください。 誰かが答えてくれます。 。。。でもね、調べることが出来るっていうことも 大事なスキルなんですよ。 最後に、malloc/reallocをつかって、 簡単なエディタを作ってみましょう。 [仕様] 1)ファイルに書き込むのはユーザーが 書き込み終わって、リターンキーを三回押したら (改行三回連打で自動書き込み。。。強制) 2)ファイルの頭には書き込んだ日付と 最初の一行の先頭5文字が自動的に入ること 3)絶対にメモリリークはさせないこと。 。。。以上 お疲れ様でした。