...

ポインタ ポインタとアドレスの利用例 ポインタ変数による計算例 課題

by user

on
Category: Documents
12

views

Report

Comments

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;
}
}
Fly UP