プログラミング 3 ポインタ(1).

Slides:



Advertisements
Similar presentations
構造体 構造体とは? 複数のデータをパックしたもの。 新しい “ 型 “ として使用できる. 構造体 キーワード struct strcut は構造体を宣言する命令。 struct { double x,y; }a,b,c; ↑ ここまでが宣 言 ← この形式で、構造体 a,b,c, を定 義.
Advertisements

メモリとポインタ. プログラムの前提 コンピュータは、0と1で計算をし、 0と1でデータを保存している。 メモリを学ぶのに必要な知識である。
第 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 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
情報・知能工学系 山本一公 プログラミング演習Ⅱ 第5回 関数(1) 情報・知能工学系 山本一公
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
ISD実習E 2009年6月29日 LISPシステム入門 (第5回) 関数ポインタ eval システム関数.
プログラミング言語としてのR 情報知能学科 白井 英俊.
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
プログラミング基礎I(再) 山元進.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
C言語講座 第4回 ポインタ.
構造体.
第4回放送授業.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
プログラミング 3 構造体(1).
C言語講座 第3回 ポインタ、配列.
プログラミング論 関数ポインタ と 応用(qsort)
プログラミング2 関数
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
プログラミング言語論 第9回 Hoare論理の練習問題 手続きの引数機構 変数の有効範囲
プログラミング 4 記憶の割り付け.
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング 3 構造体(2).
メモリの準備 メモリには、その準備の方法で2種類ある。 静的変数: コンパイル時にすでにメモリのサイズがわかっているもの。 普通の変数宣言
第7回 プログラミングⅡ 第7回
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
アルゴリズムとデータ構造 補足資料5-1 「メモリとポインタ」
高度プログラミング演習 (08).
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
第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.
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
情報処理Ⅱ 第14回 2006年1月23日(月).
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
メモリとメモリアドレス, ポインタ変数,関数へのポインタ渡し
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
演習07-0 “Hello\n” “World!\n”と
C言語 はじめに 2016年 吉田研究室.
構造体と共用体.
アルゴリズムとプログラミング (Algorithms and Programming)
プログラミング 3 2 次元配列.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
ポインタとポインタを用いた関数定義.
計算機プログラミングI 木曜日 1時限・5時限 担当: 増原英彦 第1回 2002年10月10日(木)
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
第5回 プログラミングⅡ 第5回
プログラミング 4 文字列.
岩村雅一 知能情報工学演習I 第12回(後半第6回) 岩村雅一
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
演算子のオーバーロード.
プログラミング演習I 2003年6月11日(第9回) 木村巌.
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
値渡しと参照渡しについて.
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
プログラミング演習II 2003年10月29日(第2,3回) 木村巌.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
計算機プログラミングI 第2回 2002年10月17日(木) 履習登録 複習 ライブラリの利用 (2.6-7) 式・値・代入 (2.6-8)
プログラミング 2 静的変数.
Presentation transcript:

プログラミング 3 ポインタ(1)

変数の「正体」 変数:データを入れておく,名前の付いた「箱」のよ うなもの 実際は:データは計算機の記憶装置に記憶されている 記憶装置は区画に区切られ,番号が振られている(ア ドレス) 記憶装置の区画に名前を付けて使えるようにしたも の:変数 普段は記憶装置があることやそのアドレスのことは気にしな くてもよい 記憶装置やアドレスを気にしてプログラムする方法が C 言語には備わっている

変数のアドレスを知る 変数のアドレスは,& 演算子で知ることができる &a:変数 a のアドレス アドレスは値なので,それを記憶できる変数(ポイン タ〈pointer〉)を考えることができる p がポインタであるとき, p = &a;:a のアドレスを p に代入する このとき,「ポインタ p は a を指している」という

ポインタを作る ポインタにも型がある:ポインタの型は,指す先にあ るデータの型で決まる どんな型の変数のアドレスを保持しているかで決まる int 型の変数を指すポインタ p は, int *p; と宣言する ポインタを宣言するときは,変数名の前に「*」を付ける 複数宣言するときは「int *p, *q;」のようになる 「int 型の変数を指すポインタ(int へのポインタ)」の型名 は 「int *」

ポインタの指す先を知る 単項の * 演算子で,ポインタの指す先を得られる int a; int *p; a = 10; p = &a; ←p は a を指す printf(“%d\n”, *p); ← *p は a のこと *p = 20; ←p の指す先(a)が 20 になる

演算子についてまとめ & 演算子 変数からそのアドレスを得る * 演算子 ポインタの指す先を得る & 演算子 変数からそのアドレスを得る int 型の変数から int * 型のアドレスが得られる * 演算子 ポインタの指す先を得る int * 型の値から int 型のオブジェクトが得られる ポインタは「指す先に何があるか」を把握して操作するこ と! ポインタが関連する式を扱うときは,型に注意!

練習 int a, b, *p, *q; a = 1; b = 2; p = &a; q = &b; *p += 2; b += 3; p = q; *q = 6; 各時点での a・b の値,p・q が指すもの,指す先を 追跡しましょう

ポインタと関数(1) アドレスを受け取る関数を作れる void func(int *p) { printf(“%d\n”, *p); return; } この関数はアドレスを渡して呼び出す int の変数 a のアドレスを渡す:func(&a); int へのポインタ p(の値)を渡す:func(p);

ポインタと関数(2) アドレスを返す関数も作れる int *func(int *p) { return p; }

ポインタと関数(1) C 言語では,関数の引数は値で渡される(変数の値の コピー) 引数の値を関数内で変更しても,その変更の影響は呼び出し 元に及ばない void func(int a) { a++; return; } X が 3 のとき,「func(x);」と呼び出しても x は 4 にはならず 3 のま ま

ポインタと関数(2) しかし,アドレスを渡すと,それを介して呼び出し元 の変数の値を変更できる void func(int *a) { (*a)++; return; } x が 3 のとき,func(&x) と呼び出すと x は 4 になる scanf() 関数で変数に「&」を付けて呼び出していたのはこ の仕組みを使うため

ポインタと関数(3) ポインタを使わないと作れない関数の処理がある 2 つの変数の値の入れ替え void swap(int x, int y) { int tmp; tmp = x; x = y; y = tmp; return; } 関数の中の引数 x・y を変更しても呼び出し元の変数に影響 が及ぼせない

ポインタと関数(4) これならば入れ替えができる void swap(int *x, int *y) { int tmp; tmp = *x; *x = *y; *y = tmp; return; } 「ポインタ x・y の指す先」に呼び出し元の変数があるので, ポインタを介してそれらを操作して変数の値の入れ替えがで きる 呼び出し方に注意 int a, b; に対して「swap(&a, &b);」と呼び出す

ポインタと関数(5) 「事実上複数の値を返す」関数が作れる a を b で割った商を q,あまりを r とする関数 void div(int a, int b, int *q, int *r) { *q = a / b; *r = a % b; } 呼び出し方は「div(x, y, &quo, &rem);」のようになる quo と rem は int 型の変数としてあらかじめ準備しておく