Comments
Description
Transcript
ポインタ ポインタとアドレスの利用例 ポインタ変数による計算例 課題
&:アドレス ポインタ *:ポインタ • 変数に&をつけると、その変数のアドレスを表し、ポインタに*をつけると、 そのポインタの示す格納場所の内容を表す。 • 変数をint a; とすると、メモリ内に変数aの格納場所が確保される。そのアドレ スを知るには、&a とする。 • 逆に&aのようなアドレスを値とする変数が考えられ、これをポインタという。 int a, c; int *b; ポインタとアドレスの利用例 #include <stdio.h> void main(void) { int a; int *b a = 100; printf("a:[%x, %d], b:[%x]¥n", &a, a, b); a = 200; printf("a:[%x, %d], b:[%x, %d]¥n", &a, a, b, *b); } アドレスを表示する時は書式を %x とする この例では、cがポインタとなるが、 *c という変数はアドレス(整数)である ので、int型で定義している。 ポインタ変数による計算例 /*ポインタを使った合計計算 */ #include <stdio.h> ポインタ変数 a_pointerは 変数 a の別名(ショートカットやエイリアス) void main(void) { である。 int a=100, b=200, sum=0; int *a_pointer, *b_pointer; a_pointer = &a; b_pointer = &b; sum = *a_pointer + *b_pointer; printf(“ 合計= %d ¥n", sum); /* 配列とポインタを使った合計計算 */ #include <stdio.h> void main(void) { int a[5]={1,2,3,4,5}; a[i]は *(pointer+i) と表せる 例: int sum=0, i=0; a[0]は *(pointer) と同じ int *pointer; a[1]は *(pointer+1) と同じ pointer = &a[0]; a[2]は *(pointer+2) と同じ for(i=0; i <5; i++){ sum = sum + *(pointer +i ); } printf("合計= %d ¥n", sum); } a:[bffffd94, 100], b:[80494d0] a:[bffffd94, 100], b:[bffffd94, 100] a:[bffffd94, 200], b:[bffffd94, 200] b = &a; printf("a:[%x, %d], b:[%x, %d]¥n", &a, a, b, *b); ①変数aに100を代入 a = 100; ②変数aの格納場所(アドレス)を ポインタ変数 bへ代入する。 b = &a; a = *b; ③ポインタ変数(アドレス)bに保存されている値は *bで参照できる。 実行結果 (アドレスの値は、実行のたびに異なります。) 課題 これを参考に 文字列を自分のオリ ジナルに書換える そしてコピー回数を 1億回にする #include "stdafx.h" #include <string.h> #include <time.h> int _tmain(int argc, _TCHAR* argv[]) { int i, start, end; char array[500]; char array2[500]; char *ptr; /* 長い文字列を、char 配列に代入する */ strcpy(array, "Japan7月号 完全保存版 世紀に1度の世界選手権大会" "史上最強の三冠への軌跡、監督と選手のゼロからのスタート。" "夢を捨てなかった、そして諦めなかった少年の生い立ちと" "そして汗と涙の2年間を本誌独占、直撃インタビュー" "日本を背負うプリンスと言われながらも、敗退に終わった過去を" "払拭し、怪我によるリハビリの日々に彼が見つめていたものとは?" "栄光の舞台裏には、信じられないエピソードが隠されていた。"); printf("配列arrayの中の文字列を配列array2へ1000万回コピーする¥n"); start = clock( ); for (i = 0; i < 10000000; i++) { strcpy(array2, array); } end = clock( ); printf(“配列を利用したコピー時間は、%d秒でした¥n", (end-start) ); プロジェクト名: stringcopy printf("次にポインタを利用して同じ処理を実行する¥n"); start = clock( ); for (i = 0; i < 10000000; i++) { ptr = &(array[0]); } end = clock( ); printf(“ポインタを利用したコピー時間は、%d秒でした¥n", (end-start) ); getchar(); return 0; } }