Taro-ポインタ変数Ⅰ(公開版).j

Similar documents
Taro-リストⅠ(公開版).jtd

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Taro-リストⅢ(公開版).jtd

Taro-スタック(公開版).jtd

プログラミングI第10回

PowerPoint プレゼンテーション

Microsoft PowerPoint - 11.pptx

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

PowerPoint プレゼンテーション

Taro-2分探索木Ⅰ(公開版).jtd

memo

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft Word - Cプログラミング演習(11)

Taro-2分探索木Ⅱ(公開版).jtd

第1回 プログラミング演習3 センサーアプリケーション

Microsoft Word - 3new.doc

PowerPoint プレゼンテーション

Microsoft PowerPoint - lec10.ppt

< F2D837C E95CF CF68A4A94C5816A2E6A>

Microsoft Word - Cプログラミング演習(12)

memo

Microsoft PowerPoint pptx

Microsoft Word - no13.docx

プログラミング及び演習 第1回 講義概容・実行制御

プログラミング実習I

gengo1-2

Microsoft PowerPoint - CproNt02.ppt [互換モード]

第3回 配列とリスト

kiso2-09.key

PowerPoint プレゼンテーション

Microsoft PowerPoint - 12.ppt [互換モード]

7 ポインタ (P.61) ポインタを使うと, メモリ上のデータを直接操作することができる. 例えばデータの変更 やコピーなどが簡単にできる. また処理が高速になる. 7.1 ポインタの概念 変数を次のように宣言すると, int num; メモリにその領域が確保される. 仮にその開始のアドレスを 1

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

演算増幅器

Microsoft PowerPoint - 12.ppt [互換モード]

Microsoft Word - no12.doc

02: 変数と標準入出力

PowerPoint Presentation

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

02: 変数と標準入出力

02: 変数と標準入出力

memo

Microsoft Word - Cプログラミング演習(7)

02: 変数と標準入出力

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

プログラミング基礎

Microsoft PowerPoint - 13.ppt [互換モード]

Microsoft PowerPoint - prog08.ppt

Taro-ファイル処理(公開版).jtd

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

Microsoft PowerPoint - 11.ppt [互換モード]

PowerPoint Template

Microsoft PowerPoint pptx

プログラミング実習I

Microsoft Word - Cプログラミング演習(10)

gengo1-8

演習課題No12

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - handout07.ppt [互換モード]

情報処理Ⅰ演習

PowerPoint プレゼンテーション

演算増幅器

<4D F736F F D2091E63589F182628CBE8CEA8D758DC08E9197BF2E646F6378>

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

PowerPoint プレゼンテーション

Microsoft Word - 第5回 基本データ構造2(連結リスト).doc

Microsoft PowerPoint - 13th.ppt [互換モード]

Microsoft PowerPoint - kougi8.ppt

情報処理演習 B8クラス

Prog1_15th

Microsoft Word - Cプログラミング演習(1)_2012

Microsoft Word - no02.doc

Microsoft Word - no206.docx

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

講習No.12

02: 変数と標準入出力

PowerPoint Presentation

目次

1. 入力した正の整数を降順に並べ換えて出力するプログラムを作成せよ プログラムは個別にコンパイルし make コマンドで実行すること 入力データは 50 以下とし 以下の数が混在しているとする 16 進数 : 先頭 1 文字が x または X( エックスの小文字か大文字 ) 8 進数 : 先頭 1

Microsoft Word - no202.docx

Taro-再帰関数Ⅲ(公開版).jtd

2006年10月5日(木)実施

PowerPoint プレゼンテーション

program7app.ppt

講習No.9

gengo1-12

02: 変数と標準入出力

PowerPoint プレゼンテーション

Microsoft Word - Cプログラミング演習(9)

配列, 関数, 構造体

memo

Prog1_12th

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

第2回

Taro-再帰関数Ⅱ(公開版).jtd

Microsoft PowerPoint ppt

Microsoft PowerPoint - CproNt05.ppt [互換モード]

Microsoft PowerPoint - kougi9.ppt

Microsoft PowerPoint - 5Chap15.ppt

02: 変数と標準入出力

Transcription:

0. 目次 1. ポインタ変数と変数 2. ポインタ変数と配列 3. ポインタ変数と構造体 4. ポインタ変数と線形リスト 5. 問題 問題 1 問題 2-1 -

1. ポインタ変数と変数 ポインタ変数には 記憶領域の番地が格納されている 通常の変数にはデータが格納されている 宣言 int *a; float *b; char *c; 意味ポインタ変数 aは 整数型データが保存されている番地を格納している ポインタ変数 bは 実数型データが保存されている番地を格納している ポインタ変数 cは 文字型データが保存されている番地を格納している プログラム ( ptr111.c) 1 /* << ptr111.c>> */ 2 #include <stdio.h> 3 int main () { 4 int a; /* 変数 aを整数型とする */ 5 int *p; /* ポインタ変数 pが指すデータは整数である */ 6 a = ; 7 *p = 456; 8 *p = *p*2; 9 printf(" 通常変数 aの記憶場所 = %x\n",&a); 10 printf(" 通常変数 aの値 = %d\n",a); 11 printf(" ポインタ変数 pの記憶場所 = %x\n",&p); 12 printf(" ポインタ変数 pの値 = %x\n",p); 13 printf(" ポインタ変数 pの指す値 = %d\n",*p); 14 } % cc ptr111.c %./a.out 通常変数 aの記憶場所 = 9ceb074c 通常変数 aの値 = ポインタ変数 pの記憶場所 = 9ceb0740 ポインタ変数 pの値 = 9ceb0830 ポインタ変数 pの指す値 = 912 番地は 実行の都度変わる - 2 -

番地 記憶領域 9ceb0740 9ceb0830 ポインタ変数 p が割り当てられている場所 9ceb074c 通常変数 a が割り当てられている場所 9ceb0830 912 ポインタ変数 p が指す場所 & は変数に割り当てられた番地を求める演算子である * はホ インタ変数が保持する番地の内容を求める演算子である 変数名 左図は 変数名とその内容を意味する 内容 青色は通常の変数 赤色はポインタ変数を意味する ポインタ変数に保存されている番地は 矢印で表す a p - 3 -

2. ポインタ変数と配列 配列の実体はポインタである 配列名がポインタ変数となる x[0] と *(x+0) x[1] と *(x+1) x[2] と *(x+2) は同等である プログラム ( ptr211.c) 1 /* << ptr211.c>> */ 2 #include <stdio.h> 3 int main () { 4 int x[3]; /* 配列 x を整数型とする */ 5 x[0] = ; 6 x[1] = 456; 7 x[2] = 789; 8 /* 配列的記述 */ 9 printf("x[0] = %d\n",x[0]); 10 printf("x[1] = %d\n",x[1]); 11 printf("x[2] = %d\n",x[2]); 12 /* ポインタ的記述 */ 13 printf("*(x+0) = %d\n",*(x+0)); 14 printf("*(x+1) = %d\n",*(x+1)); 15 printf("*(x+2) = %d\n",*(x+2)); 16 } % cc ptr211.c % a.out x[0] = x[1] = 456 x[2] = 789 *(x+0) = *(x+1) = 456 *(x+2) = 789-4 -

配列名を他のポインタ変数に代入することができる プログラム ( ptr221.c) 1 /* << ptr221.c>> */ 2 #include <stdio.h> 3 int main () { 4 int x[3]; /* 配列 x を整数型とする */ 5 int *y; 6 x[0] = ; 7 x[1] = 456; 8 x[2] = 789; 9 y = x; 10 /* 配列的記述 */ 11 printf("y[0] = %d\n",y[0]); 12 printf("y[1] = %d\n",y[1]); 13 printf("y[2] = %d\n",y[2]); 14 /* ポインタ的記述 */ 15 printf("*(y+0) = %d\n",*(y+0)); 16 printf("*(y+1) = %d\n",*(y+1)); 17 printf("*(y+2) = %d\n",*(y+2)); 18 } % cc ptr221.c % a.out y[0] = y[1] = 456 y[2] = 789 *(y+0) = *(y+1) = 456 *(y+2) = 789 配列名 x はポインタ変数であるが他のポインタ変数から代入はできない プログラム ( ptr231.c) 1 /* << ptr231.c >> */ 2 #include <stdio.h> 3 int main() { 4 int x[3],*y; 5 y = x; /* OK */ 6 x = y; /* エラー */ 7 } % cc ptr231.c pointer23.c: In function main : pointer23.c:6: error: incompatible types when assigning to type int[3] from type int * - 5 -

3. ポインタ変数と構造体 構造体は 複数のデータをまとめて扱う 構造体の定義は次のように行う struct 構造体名 { メンバー 1 ; メンバー 2 ; メンバー n ; }; struct 構造体名変数名 ; 新たなデータ型を定義したと考えられる 構造体を変数で宣言した場合 宣言時に記憶領域が確保される メンバーを指定するのに 演算子. を使う プログラム ( ptr311.c) /* << ptr311.c >> */ #include <stdio.h> int main () { struct complex { int rpart; int ipart; }; 1 struct complex z; 2 z.rpart = ; 3 z.ipart = 456; printf("rpart:%d ipart:%d\n",z.rpart,z.ipart); } rpart: ipart:456 z 456 動作 1 struct complex z; z 記憶領域が確保される 2 z.rpart = ; z 3 z.ipart = 456; z 456-6 -

構造体をポインタ変数で宣言した場合 記憶領域は確保されないので 自分で確保する必要がある メンバ指定には 演算子 -> を使う プログラム ( ptr321.c) /* << ptr321.c >> */ #include <stdio.h> #include <stdlib.h> int main () { struct complex { int rpart; int ipart; }; struct complex *p; 1 p = (struct complex *)malloc(sizeof(struct complex)); 2 p->rpart = ; 3 p->ipart = 456; 4 printf("rpart:%d ipart:%d\n",p->rpart,p->ipart); free(p); 5 printf("rpart:%d ipart:%d\n",p->rpart,p->ipart); } rpart: ipart:456 rpart:0 ipart:0 456 p 意味 sizeof( 型名 ) 指定した型名に必要なバイト数を返す malloc( サイズ ) サイズで指定された大きさの記憶領域が確保され先頭番地が返される ( 注意 1 ) sizeof は演算子で malloc は関数である ( 注意 2 ) (struct complex *) をキャストという ( 注意 3 ) 確保した記憶領域を開放するのに free 関数を使う ( 注意 4 ) malloc 関数 free 関数を使うときは 標準ヘッダファイル stdlib.h をインクルードしておく必要がある - 7 -

動作 1 struct complex *p; p 構造体のデータを格納する記憶領域は確保されていない 2 p = (struct complex *)malloc(sizeof(struct complex)); 構造体のデータを格納する記憶領域が確保された p sizeof(struct complex) で構造体 complex の大きさが求められ malloc でその大きさの記憶領域が確保され 先頭番地が返されてくる (struct complex *) で 返されてきた先頭番地が構造体 complex の境界に合うように変換される 3 p->rpart = ; p 4 p->ipart = 456; 456 p 5 free(p); p - 8 -

4. ポインタ変数と線形リスト 一連のデータをポインタでつなぎ合わせたものを線形リストという 456 789 NULL 4. 1 線形リストの作成と表示 プログラム ( ptr411.c) 1 /* << ptr411.c >> */ #include <stdio.h> #include <stdlib.h> int main () { /* 構造体の定義 */ struct NODE { int info; struct NODE *next; /* nextは ポインタ変数 */ }; /* 構造体の宣言 */ struct NODE *p,*q,*r,*s; 2 p = (struct NODE *) malloc(sizeof(struct NODE)); 3 p->info = ; 4 q = (struct NODE *) malloc(sizeof(struct NODE)); 5 q->info = 456; p->next = q; 6 r = (struct NODE *) malloc(sizeof(struct NODE)); 7 r->info = 789; q->next = r; 8 r->next = NULL; /* 線形リストをたどる */ s = p; while( s!= NULL ) { printf("%d\n",s->info); s = s->next; } 9 free(p); free(q); free(r); } 456 789 456 789 NULL - 9 -

動作 1 struct NODE *p,*q,*r,*s; s 2 p = (struct NODE *) malloc(sizeof(struct NODE)); sizeof(struct NODE) で構造体 NODE の大きさが求められ malloc でその大きさの記憶領域が確保され 先頭番地が返されてくる (struct NODE *) で 返されてきた先頭番地が構造体 NODE の境界に合うように変換される 3 p->info = ; 4 q = (struct NODE *) malloc(sizeof(struct NODE)); 5 q->info = 456; p->next = q; 456 6 r = (struct NODE *) malloc(sizeof(struct NODE)); 456-10 -

7 r->info = 789; q->next = r; 456 789 8 r->next = NULL; 456 789 NULL 9 free(p); free(q); free(r); - 11 -

5. 問題 問題 1 1 人の学生について 3 科目の成績 ( 国語 数学 英語 ) をもつとき つぎの構造体で表現する 1 struct student { 2 int kokugo; 3 int suugaku; 4 int eigo; 5 } 1 人分の成績データを読み込んだ後 平均値を出力するプログラムを作成せよ ただし 構造体とポインタ変数を使うこと 1 /* << ptr511.c >> */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main () { 5 int sum; 6 struct student { 7 int kokugo; 8 int suugaku; 9 int eigo; 10 }; 11 struct student *p; 12 p = (struct student *)malloc(sizeof(struct student)); 13 scanf("%d%d%d",&p->kokugo, 14 &p->suugaku, 15 1 ); 16 sum = p->kokugo + p->suugaku + 2 ; 17 printf("%f\n",sum/3.0); 18 } % cc ptr511.c % a.out 10 20 30 20.000000-12 -

問題 2 学生数 n( 最大 100 名 ) を読み込んだ後 国語 数学 英語の平均値を出力するプログラムを作成せよ ただし 構造体とポインタ変数を使うこと 1 /* << ptr521.c >> */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 int main () { 5 int i,n,sum1,sum2,sum3; 6 struct student { 7 int kokugo; 8 int suugaku; 9 int eigo; 10 }; 11 struct student *p[100]; 12 scanf("%d",&n); 13 for( i=0; i<n; i++ ) { 14 p[i] = (struct student *)malloc(sizeof(struct student)); 15 scanf("%d%d%d",&p[i]->kokugo,&p[i]->suugaku, 16 3 ); 17 } 18 sum1 = 0; sum2 = 0; sum3 = 0; 19 for( i=0; i<n; i++ ) { 20 sum1 = sum1 + p[i]->kokugo; 21 sum2 = sum2 + p[i]->suugaku; 22 sum3 = sum3 + 4 ; 23 } 24 printf(" 国語の平均 : %f\n",sum1/(float)n); 25 printf(" 数学の平均 : %f\n",sum2/(float)n); 26 printf(" 英語の平均 : %f\n",sum3/(float)n); 27 } % cc ptr521.c % a.out 3 11 31 51 12 32 52 13 33 53 国語の平均 : 12.000000 数学の平均 : 32.000000 英語の平均 : 52.000000 p[0] p[1] p[2] 11 31 51 12 32 52 13 33 53 p[99] - 13 -