2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」

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.
C 言語講座 第 7 回 ポインター. メモリとアドレス(ポインターの前 に) コンピュータのメモリには 1 バイトずつ 0 番地、 1 番地、 2 番地・・・というように 住所が割り当てられている この住所をアドレスという。 メモリはデータをしまうもので それを引き出すためには メモリに番号(アドレス)を振っておけばよいな.
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング入門2 第4回 配列 for文 変数宣言 初期化
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
第2章 数値の入力と変数 scanfと変数をやります.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
基礎プログラミングおよび演習 第9回
基礎プログラミングおよび演習 第8回.
プログラミング言語論 第6回 型 情報工学科 篠埜 功.
C言語講座 第4回 ポインタ.
第8回 プログラミングⅡ 第8回
第6章 2重ループ&配列 2重ループと配列をやります.
構造体.
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
C言語講座 第3回 ポインタ、配列.
プログラムの制御構造 選択・繰り返し.
精密工学科プログラミング基礎 第10回資料 (12/18実施)
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング入門2 第11回 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第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.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
岩村雅一 知能情報工学演習I 第9回(後半第3回) 岩村雅一
整数データと浮動小数データ.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
配列変数とポインタ 静的確保と動的確保 ポインタ配列 2次元配列 時間計測 第1回レポートの課題
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
精密工学科プログラミング基礎Ⅱ 第5回資料 今回の授業で習得してほしいこと: 構造体 (教科書 91 ページ)
構造体と共用体.
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
ポインタとポインタを用いた関数定義.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
第13回 ポインタ 1 1.
プログラミング論 ポインタ
ネットワーク・プログラミング Cプログラミングの基礎.
プログラミング入門2 第5回 配列 for文 変数宣言 初期化
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
湘南工科大学 2013年10月22日 情報理論2 湘南工科大学情報工学科 准教授 小林 学.
マスク合成(のような処理) 出力画像 Out 入力画像1 In1 In1 In2 Out 入力画像2 In
左右反転と180度回転 [0][xsize – 1] [0][0] → i ↓ j [ysize – 1][xsize – 1]
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理Ⅱ 小テスト 2005年2月1日(火).
第2章 数値の入力と変数 scanfと変数をやります.
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
C言語講座 四則演算  if ,  switch 制御文.
プログラミング演習I 補講用課題
第1章 文字の表示と計算 printfと演算子をやります 第1章 文字の表示と計算.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
Presentation transcript:

2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」 西尾 信彦 nishio@cs.ritsumei.ac.jp 立命館大学情報理工学部 情報システム学科

配列 配列とは? 宣言の仕方 同一型の変数が(メモリ上に隣接して)並んだもの 配列のデータ型 配列名[配列の大きさ]; 例: int sample[4]; ⇒int型のデータの入る変数4個分を宣言 char name[32]; ⇒char型のデータの入る変数32個分を宣言

[]の中は0から始まる int sample[4]; と宣言すれば “[]”は添字演算子とも呼ばれる int sample[4]; と宣言すれば sample[0], sample[1], sample[2] ,sample[3]のint型のデータが格納できる4つの変数を宣言したことになる。

配列の例: 実行結果: #include <stdio.h> int main(){ int sample[4]; int i; for(i = 0; i < 4; i++){ sample[i] = i + 1; printf("sample[%d] = %d\n", i, sample[i]); } 実行結果: sample[0] = 1 sample[1] = 2 sample[2] = 3 sample[3] = 4

変数のチェック ~正しいプログラムを書くために~ コンパイラにできること コンパイラには配列は判断できない? だから気をつけないと 動かしてみないとわからないこと C言語はやってくれない だから気をつけないと!

ポインタ(というデータ)とは? 変数のメモリ上での位置を表わすデータ ポインタというデータの正体: ポインタデータの作り方 それが 指す変数が格納された メモリ上の先頭アドレスと 指す変数に格納されるデータのサイズによって表わす ポインタデータの作り方 そのポインタが指したい変数の頭に&をつける &は実は演算子(アドレス演算子)

しかし,このデータをどう使う? そのままでは代入くらいにしか使えない ポインタ変数の宣言の仕方(作り方) ポインタ演算 代入式の右辺と左辺 右はデータ,左は変数って気づいてた? ポインタ変数の宣言の仕方(作り方) データ型 *変数名; 例: int *value; ポインタ演算 ポインタの足し算,引き算

ポインタの例: 実行結果: #include <stdio.h> int main(void){ int data = 33; int *data_pointer; data_pointer = &data; /* dataのアドレスをdata_pointerに代入*/ printf("data = %d\n", data); printf("&data = %d (%x)\n", &data, &data); /* dataのアドレスを参照 */ printf("*data_pointer = %d\n", *data_pointer); /* アドレス先の値を参照 */ printf("data_pointer = %d (%x)\n", data_pointer, data_pointer); } 実行結果: data = 33 &data = 1245064 (12ff88) *data_pointer = 33 data_pointer = 1245064 (12ff88)

演算子と式 演算子は計算するためのもの 計算したら結果(答)が出る 例 四則演算(+-*/)は知ってますよね? 例 四則演算(+-*/)は知ってますよね? [数字] [演算子] [数字] と並べるけど [演算子] [数字] なんてのもある さらに数字は式でもいい 演算子には優先度があるので()が必要 計算したら結果(答)が出る 式を計算したら答が出る C言語では、「式を評価すると値が出る」という &も*も演算子 --も++も演算子 []も実は演算子 さらに””も=も演算子

&は変数を評価してその変数へのポインタを値とする *はその逆 *は中置演算子の場合は乗算 A * (B + C) *は前置演算子の場合はポインタの指す先 *A = *B * 2 ++と—は前置と後置ができる 評価した値が違うだけ 1加減した後の値と1加減する前の値 &は変数を評価してその変数へのポインタを値とする *はその逆 & [変数]  ポインタ * [ポインタ]  変数

配列とポインタの関係 配列名はその配列の第0要素へのポインタ しかし, int array[100]; arrayは&(array[0])と同じ しかし, 配列名は変数ではないので代入できないことに注意 配列は各要素が隣接しているのを利用できるので便利

配列とポインタの例: #include <stdio.h> #define ARRAY_LENGTH 3 int main( ){ int intMemory[ARRAY_LENGTH]; int *pointer; int i; pointer = &intMemory[0]; // ポインタの初期値を配列の先頭アドレスに設定 for(i = 0; i < ARRAY_LENGTH; i++){ scanf("%d", pointer); // 整数の入力. pointer++; // ポインタを1 つずらす } printf("値: アドレス\n"); pointer = intMemory; // ポインタの初期値を配列の先頭アドレスに設定 printf("%d: %x\n", *pointer, pointer); pointer++;// ポインタを1 つずらす

実行結果: 32 56 78 値: アドレス 32: 12ff80 56: 12ff84 78: 12ff88

ところで... 変数はいつできて,いつなくなるのか? どこから参照できるのかも重要 ものによって違う 静的変数 ローカル変数 グローバル変数 動的変数 (未出,来週やります)