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.

Slides:



Advertisements
Similar presentations
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Advertisements

プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
情報処理演習C2 ファイル操作について (2).
ポインタ プログラミング入門2 第10回 芝浦工業大学情報工学科 青木 義満
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
プログラミング入門2 第10回 動的な領域確保 情報工学科 篠埜 功.
データ構造とアルゴリズム 第10回 mallocとfree
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
プログラミング基礎I(再) 山元進.
プログラミング言語Ⅰ(実習を含む。), 計算機言語Ⅰ・計算機言語演習Ⅰ, 情報処理言語Ⅰ(実習を含む。)
12: コマンドライン引数 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
情報処理Ⅱ 2005年12月9日(金).
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページ を開いておくこと
第8回 プログラミングⅡ 第8回
担当:青木義満 情報工学科 3年生対象 専門科目 システムプログラミング システムプログラミング プロセス間通信(パイプ) 担当:青木義満
理由:文字数より要素数の多い配列を用いた時に,文字列の最後を示すため
ファイル操作と文字列の利用.
第3回 配列,構造体,ポインタ ~ データ構造について学ぶための基礎~
精密工学科プログラミング基礎Ⅱ 第3回資料 今回の授業で習得してほしいこと: 2次元配列の使い方 (前回の1次元配列の復習もします.)
情報処理Ⅱ 2007年11月5日(月).
プログラミング論 関数ポインタ と 応用(qsort)
ちょっとした練習問題① 配列iroを['R', 'W', 'R', 'R', 'W' , 'W' , 'W']を宣言して、「W」のときの配列の番号をprintfで表示するようなプログラムを記述しなさい。
プログラミング論 II 2008年10月30日 文字列
iioLoadFile()とiioMallocImageBuffer()の補足
プログラミング 4 記憶の割り付け.
2005年度 データ構造とアルゴリズム 第3回 「C言語の復習:再帰的データ構造」
第10章 これはかなり大変な事項!! ~ポインタ~
プログラミング入門2 第8回 ポインタ 情報工学科 篠埜 功.
プログラミング入門2 第11回 情報工学科 篠埜 功.
演習1の解答例の解説 2004年10月21日 海谷 治彦.
プログラミング入門2 第11回 情報工学科 篠埜 功.
第7回 プログラミングⅡ 第7回
地域情報学 C言語プログラミング 第5回 ポインタ、関数、ファイル入出力 2017年11月17日
09: ポインタ・文字列 C プログラミング入門 総機1 (月1) Linux にログインし、以下の講義ページ を開いておくこと
プログラミング基礎B 文字列の扱い.
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
データ構造とアルゴリズム 第11回 リスト構造(1)
プログラミング入門2 第9回 ポインタ 情報工学科 篠埜 功.
アルゴリズムとプログラミング (Algorithms and Programming)
文字列へのポインタの配列 static char *lines[MAXLINES]; lines[0] NULL
高度プログラミング演習 (09).
ポインタとポインタを用いた関数定義.
情報基礎演習B 後半第2回 担当 岩村 TA 谷本君.
プログラミング論 ポインタ
09: ポインタ・文字列 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
12: コマンドライン引数 C プログラミング入門 基幹7 (水5) Linux にログインし、以下の講義ページを開いておく こと
ネットワーク・プログラミング Cプログラミングの基礎.
情報処理Ⅱ 2006年11月24日(金).
プログラミング論 文字列
プログラミング 4 文字列.
情報処理Ⅱ 2006年11月8日(金).
全体の流れ 画像ファイルを開き,画像データをメモリ上にロード メモリ上にロードした画像データに処理を加える
2005年度 データ構造とアルゴリズム 第2回 「C言語の復習:配列」
情報処理Ⅱ 2005年11月25日(金).
プログラミング演習II 2004年11月 16日(第5回) 理学部数学科・木村巌.
15.1 文字列処理の基本 15.2 文字列処理用ライブラリ関数
プログラミング演習II 2004年11月 2日(第3回) 理学部数学科・木村巌.
マスク合成(のような処理) 出力画像 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日(火).
モバイルプログラミング第3回 Cプログラミングの基礎( 2 )
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング 3 ポインタ(1).
12: コマンドライン引数 C プログラミング入門 基幹2 (月4) Linux にログインし、以下の講義ページ を開いておくこと
計算機プログラミングI 第5回 2002年11月7日(木) 配列: 沢山のデータをまとめたデータ どんなものか どうやって使うのか
Presentation transcript:

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 p = q; ポインタ同士の代入なのでOK p = m; NG m = p; NG m = (*p); OK. pが指している物の中身を参照してmに代入. p = array; OK. 配列の先頭アドレスを代入 p = array[0]; NG. pはポインタ. array[0]はint型 array [0] [1] [2] pArray ・ [0] [1] [2]

文字列へのポインタの配列 (76行目) static char *lines[MAXLINES]; lines[0] NULL 文字列へのポインタの配列 (76行目)  static char *lines[MAXLINES]; lines[0] NULL lines の各要素lines[0],lines[1],…の値は, 各要素が指す文字列領域の先頭アドレスである. つまり,ポインタとは,指し示すメモリ領域の 先頭アドレスを格納している. lines[1] lines[2] 文字列へのポインタ   char* p; ポインタはアドレスを格納する変数. 文字列へのポインタpは、pの指す文字列領域の先頭アドレスを格納.

malloc 関数で確保したメモリ領域のアドレスを,ReadLines関数の引数 として渡された文字列へのポインタの配列に順に格納  (26行目) int cnt: 初期値cnt=0からcnt++することで, lines[0],lines[1]…と次の行へ移動 lines[cnt]: 文字列へのポインタ. lines[cnt] = malloc(strlen(buf) + 1); static char buf[LINELENGH]: 標準入力(キーボード)で入力した文字列が入る領域. strlen(buf): bufの指す文字列の長さ.         引数に文字列へのポインタbufを取り,文字数(\0は含まない)を返す. malloc(strlen(buf)+1): 文字列の長さに合わせてメモリ領域を確保する.              ただし,C言語における文字列は,\0で終端する              必要があるため,(文字数+1)バイトのメモリ領域が必要. mallocで確保した領域へのポインタが代入される char buf[] = "strawberry"; strlen(buf)は10を返す. NULL lines[0] lines[1] lines[2] malloc後に 10+1バイトの領域が確保される

文字列のコピー (31行目) lines[cnt]: 文字列へのポインタ. 文字列のコピー (31行目) lines[cnt]: 文字列へのポインタ. buf: 標準入力(キーボード)から読み込んだ文字列へのポインタ. strcpy(lines[cnt], buf): 文字列のコピー.              第1引数にコピー先文字列領域へのポインタlines[cnt], 第2引数にコピー元文字列へのポインタbufを取り,              bufの指すコピー元文字列からlines[cnt]の指すコピー先 文字列領域にコピー. 例 strcpy(lines[2],buf); lines[0] strawberry\0 cnt=2; buf lines[1] watermelon\0 banana\0 lines[2]

文字列のコピー (31行目) lines[cnt]: 文字列へのポインタ. 文字列のコピー (31行目) lines[cnt]: 文字列へのポインタ. buf: 標準入力(キーボード)から読み込んだ文字列へのポインタ. strcpy(lines[cnt], buf): 文字列のコピー.              第1引数にコピー先文字列領域へのポインタlines[cnt], 第2引数にコピー元文字列へのポインタbufを取り,              bufの指すコピー元文字列からlines[cnt]の指すコピー先 文字列領域にコピー. 例 strcpy(lines[2],buf); lines[0] strawberry\0 cnt=2; buf lines[1] watermelon\0 banana\0 lines[2] banana\0

文字列の大小を比較(辞書順) strcmpの使い方 const char *string1: 文字列string1のポインタ. const char *string1: 文字列string2のポインタ. int strcmp(const char *string1,const char *string2); 文字列の大小比較.         第1引数に文字列string1のポインタ,         第2引数に文字列string2のポインタを取り,             文字列string1, string2を辞書順に大小比較.         戻り値は,          string1>string2なら正の数, string1<string2なら負の数, string1=string2なら0である. これは関数の宣言. 引数はconst charのポインタだよという意味. 例) char *string1 = "strawberry"; char *string2 = " watermelon"; strcmp(string1, string2); は string1<string2なので負の数を返す. これは関数の呼び出し. 文字列のポインタである string1 が引数に入っている.

Sort関数: 複数の文字列を辞書順にソート (65行目~) 文字列をソートするには,lines の各要素lines[0],lines[1],…の指している文字列どうしをstrcmp関数で比較して辞書順に整列するように,各要素の値,つまり,ポインタの中身を入れ替えればよい. banana\0 strawberry\0 lines[0] lines[1] lines[2] watermelon\0 Sort関数 ポインタが入れ替わり, lines[0],lines[1],…の 順で指している文字列が 辞書順に並ぶ. ポインタの指している文字列をstrcmp関数で比較して辞書順に整列するようにポインタの中身の入れ替えを行っているだけなので,文字列のメモリ上の位置は変わらない. つまり,linesの各要素の値である各文字列の先頭アドレスだけ入れ替える.

文字列へのポインタの配列を使うと、実際に文字列を動かさなくても並べ替えの働きを実現できる. lines[0] strawberry\0 lines[0] strawberry\0 lines[1] watermelon\0 lines[1] watermelon\0 lines[2] banana\0 lines[2] banana\0 Sort関数 ポインタが入れ替わり, lines[0],lines[1],…の 順で指している文字列が 辞書順に並ぶ. lines[num-1] lines[num-1] 文字列へのポインタの配列を使うと、実際に文字列を動かさなくても並べ替えの働きを実現できる. また,文字列に限らずXXXへのポインタの配列を使うことで,同様にXXXを並べ替えることもできる. yamada\0 090-xxxxxxx\0 ymd@is...\0 strawberry\0 watermelon\0 suzuki\0 090-xxxxxxx\0 suzu@is...\0 この例では文字列だったが 構造体の並べ替えにも応用可