第10章 これはかなり大変な事項!! ~ポインタ~

Slides:



Advertisements
Similar presentations
メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
Advertisements

第 2 章 数値の入力と変数 scanf と変数をやります 第 2 章 数値の入力と変数 1. 以下のプログラムを実行してみよう  C 言語では文の最後に「 ; 」(セミコロン)が付きます 第 2 章 数値の入力と変数 2 #include int main() { int x; x = 3; printf("x.
第6章 ポインタ ポインタが分からずにC言語を投げ出す人が数多くいます。 その半面、使いこなせば強力な武器となります。 しっかりと学習していきましょう C 言語 最難関文法 C 言語 最難関文法 1 第 6 章 ポインタ.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
コンピュータープログラミング(C言語)(3) 1.関数と分割コンパイル (復習) 2.キーボード入力
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
第2章 数値の入力と変数 scanfと変数をやります.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
C言語講座 第4回 ポインタ.
第8回 プログラミングⅡ 第8回
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
精密工学科プログラミング基礎 第9回資料 (12/11 実施)
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
第10回 プログラミングⅡ 第10回
第10章 char 文字列; 文字列を入力させるよ!.
C言語講座 第3回 ポインタ、配列.
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング 4 記憶の割り付け.
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
前回の練習問題.
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
第13章 文字の取り扱い方 13.1 文字と文字型関数 13.2 文字列 13.3 文字型配列への文字列の代入
第7回 プログラミングⅡ 第7回
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
第11回 プログラミングⅡ 第11回
P n ポインタの基礎 5 q m 5 7 int* p; int 型の変数を指すポインタ int* q; int 型の変数を指すポインタ int n=5, m=7; int 型の変数 int array[3]; int* pArray[3]; p = &n; ポインタにアドレスを代入しているのでOK.
プログラミング基礎B 文字列の扱い.
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
精密工学科プログラミング基礎Ⅱ 第4回資料 今回の授業で習得してほしいこと: 文字列の扱い ファイル入出力の方法 コマンドライン引数の使い方
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
今まで写経のように書いてきた『void main()』も、これでようやく話ができる!
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
第4章 反復作業を楽にする方法!! ~繰り返しその1 while~
第1章 いよいよプログラミング!! ~文章の表示 printf~
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
第13章 文字の取り扱い方 13.1 文字と文字型変数 13.2 文字列 13.3 文字型配列への文字列の代入
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
プログラミング論 ポインタ
第5回 プログラミングⅡ 第5回
第5章 まだまだ続く反復処理!! ~繰り返しその2 for~
変数を一度にたくさん宣言するよ! それだけじゃないよ!
第2章 printf(“変数と入力”); scanf(“%d”,&num);
標準入出力、変数、演算子、エスケープシーケンス
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
プログラミング 4 文字列.
第7章 そろそろ int 以外も使ってみよう! ~データ型 double , bool~
第12章 乱数という業の深い存在 ~ランダムな値・他~
プログラミング演習I 2003年6月11日(第9回) 木村巌.
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
プログラミング入門2 第5回 配列 変数宣言、初期化について
第2章 数値の入力と変数 scanfと変数をやります.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
プログラミング演習I 補講用課題
岩村雅一 知能情報工学演習I 第9回(C言語第3回) 岩村雅一
Presentation transcript:

第10章 これはかなり大変な事項!! ~ポインタ~ メモリ上の番地アドレスから遡って、変数の値 を見ていったりするする 第10章 ポインタ

前回やったこと 文字を変数に入れるための char 型 文字列は配列を使い、その最後には『\0』が終 了点として必ず付けられる コンピュータ内で文字と整数値は対応しており、 それは文字コードに則って決められている 第10章 ポインタ

今日の予定 アドレスとポインタ 変数のアドレスとポインタ変数 ポインタと関数 ポインタと配列 第10章 ポインタ

アドレスとポインタ(1) すべての変数は、メモリ上にその分の領域とい うものが確保されている そのメモリ上の位置、番地のことをアドレスと いう ある変数のアドレスは、その変数名に『&』を 付け加えたもので、たとえば、変数a のアドレ スは『&a』と表される 第10章 ポインタ

アドレスとポインタ(2) このアドレスを代入できる特殊な変数をポイン タという 宣言 初期化 int *p; 代入時は『*』がいらないので注意 int *p; p = &a; 第10章 ポインタ

アドレスとポインタ(3) また以下のようにポインタ変数に『*』をつけ ると、ポインタに入っているアドレスの指す変 数と同じ扱いになる つまり *p = a int a = 25; int *p; p = &a; *p = 50; printf(“%d\n”, a); 色々省略 宣言時の『*』とは別個に 思って 第10章 ポインタ

アドレスとポインタ(4) ここでひとつ実行してみよう #include <stdio.h> int main(){ int a = 25; int *p = &a; printf(“%d\n”, a); printf(“%d\n”, *p); *p = 50; return 0; } 第10章 ポインタ

アドレスとポインタ 実行結果 このように『*p』など『*』などをつけてアド レス先の変数と同じ扱いになることを 間接参照というよ  間接参照というよ 用語は好きに覚えてね 第10章 ポインタ

練習問題1 以下のコードを必ず使って、入力した数値を間 接参照で表示し、値を10倍して今度は元の変数 で表示をやってみよう 実行例はこちら printf(“a > %d\n”, *p); printf(“a × 10 = %d\n”, num); 第10章 ポインタ

練習問題1 回答例 ちょっと まわりく どいかな #include <stdio.h> int main(){ int num; int *p; printf("値を入力してください > "); scanf("%d", &num); p = &num; printf("num > %d\n", *p); *p *= 10; printf("num × 10 = %d\n", num); return 0; } 第10章 ポインタ

ポインタと関数(1) 以下のプログラムは sub 関数で変数a の値を変 更しているが、うまくいっていない #include <stdio.h> void sub(int a){ a = 100; } int main(){ int a = 0; sub(a); printf(“%d\n”, a); return 0; 第10章 ポインタ

ポインタと関数(2) 関数に渡した値は、関数内の変数にコピーされ、 使用されている つまりその変数はローカル変数(そういやそんな のあった)なので、値を変更しても、関数の外ま でそれが適用されない ゆえに、前ページのプログラムの値は変わらな い 第10章 ポインタ

ポインタと関数(3) 今度は関数にアドレスを渡してみる #include <stdio.h> void sub(int *p){ } int main(){ int a = 0; sub(&a); printf(“%d\n”, a); return 0; 第10章 ポインタ

ポインタと関数(4) ポインタに『*』をつけたものは、そのアドレ スが指す変数と同じに扱う(2度目) この場合、アドレスを経由して変数の値をい じったため、関数の外においても変更が適用さ れているよ 第10章 ポインタ

練習問題2 半径を入力して、そこから円の円周と面積を求 める calc 関数を作ってみよう その時必ず以下の main 関数を用いてね int main(){ double a, b, c; printf(“半径は > ”); scanf(“%lf”, &a); calc(a, &b, &c); printf(“円周は > %f\n”, b); printf(“面積は > %f\n”, c); return 0; } 円周率は 3.14 で 第10章 ポインタ

練習問題2 回答例 『*』ば かりで すね #include <stdio.h> void calc(double a,double *b, double *c){ *b = a * 2 * 3.14; *c = a * a * 3.14; } int main(){ double a, b, c; printf(“半径は > ”); scanf("%lf", &a); calc(a,&b,&c); printf("円周は > %f\n",b); printf("面積は > %f\n",c); return 0; 第10章 ポインタ

ポインタと配列(1) 配列のアドレス int num[5]; &num[0], &num[1], &num[2], ……… たとえば という配列をつくったとして、それぞれの変数のアドレ スは &num[0], &num[1], &num[2], ……… となるのはイメージしやすいと思うけど、実は配列名で ある num も &num[0] と同じく num[0] のアドレス を表している int num[5]; 第10章 ポインタ

ポインタと配列(2) 配列名 num が &num[0] と表すとき、 num+1 は &num[1]、num+2 は &num[2]… を表すことになる つまり ⇒ ちなみに『*p』も『*(p+1)』『*(p+2)』…と していくことで、隣の領域にある変数の値を示 していくことができる *num == num[0] *(num+1) == num[1] *(num+2) == num[2] 第10章 ポインタ

ポインタと配列(3) これで関数に配列を渡すやり方が説明できる! 実行してみよう! #include <stdio.h> void clear(int *p){ for(int i=0; i < 5; i++){ *(p + i) = 0; } int main(){ int num[5] = {98, 102, 5, 77, 236}; clear(num); printf(“%d\n”, num[i]); } return 0; 実行してみよう! 第10章 ポインタ

ポインタと配列(4) 実行結果 clear 関数に配列名 num を引数として渡し、そ れをポインタで受け取る 関数内の処理で『*p』『*(p+1)』『*(p+2)』 …としていくことで『*num[0]』 『*num[1]』『*num[2]』…と同じことをし ているよ 第10章 ポインタ

ポインタのまとめ 変数のアドレスを格納できるポインタ変数 ポインタに『*』をつけることでアドレス先の 変数と同じ扱いができる 配列名は配列の先頭の変数のアドレスと同じ 配列を関数に渡す時、ポインタとして受けるこ とができる ややこしいのでまとめてみました 第10章 ポインタ

練習問題3 文字列を入力させて、その長さを算出する strlen 関数を使ったプログラムを作ってみよう ヒント:文字列は『\0』 で必ず終わるよ 文字列を入力させて、その長さを算出する strlen 関数を使ったプログラムを作ってみよう int main(){ char words[128]; int num = 0; printf("文字列を入力してみよう > "); scanf("%s", words); num = strlen(words); printf("文字列の長さは %d です\n", num); return 0; } main 関数はこんなカンジ 第10章 ポインタ

練習問題3 回答例 #include <stdio.h> int strlen(char *p){ int n = 0; while(*p != '\0'){ p++; // このカタチでもポインタをずらせる n++; } return n; int main(){ char words[128]; // ちゃんと十分に配列を確保しよう! int num = 0; printf(“文字列を入力してみよう > ”); scanf("%s", words); num = strlen(words); printf("文字列の長さは %d です\n", num); return 0; 第10章 ポインタ

次回予告 変数をまとめて宣言する方法 ヘッダーファイルを自分で作る プログラミングで便利な構造体のはなし 第10章 ポインタ

テンプレ テンプレ 第10章 ポインタ