本日の目標
- ポインタとは何か知り、理解することができる。
- ポインタを使ったプログラムを作成できる。
- 関数の引数にポインタを使ってデータの受け渡しができる。
予習・復習
以下のスライドを利用して、予習と復習をしよう。復習では、自分の理解度を確認するために、実際にプログラムを作成し、意図する結果が得られるか確認しよう。本日の講義・演習予定
- ポインタ
- ポインタ変数を引数とする関数
- 演習問題
- 提出課題
char ch; int a; double x;プログラム中では各変数への値の代入や参照は宣言時に付けられた変数名を利用しますが、実際にはメモリアドレスを使ってメモリ領域への書き込み・読み出しが行われます。複数バイト領域からなるint型やdouble型の場合は、その先頭アドレスが使われます。
int a; int *p; //ポインタの宣言 a = 1000; // 変数aの値を確定 p = &a; // 変数aのアドレスをポインタpに代入 ・・・

#include <stdio.h>
int main(void)
{
int a,b,c;
a = 1000;
b = 2000;
c = 3000;
printf("a = %d (%p)\n", a, &a); //変数aのアドレス
printf("b = %d (%p)\n", b, &b); //変数bのアドレス
printf("c = %d (%p)\n", c, &c); //変数cのアドレス
return 0;
}

#include <stdio.h>
int main(void)
{
char c;
int a;
double x;
c = 'A';
a = 1000;
x = 0.124;
printf("c = %c (%p) %luByte\n",c,&c,sizeof c); //変数cのアドレスとサイズ
printf("a = %d (%p) %luByte\n",a,&a,sizeof a); //変数aのアドレスとサイズ
printf("x = %f (%p) %luByte\n",x,&x,sizeof x); //変数xのアドレスとサイズ
return 0;
}

#include <stdio.h>
int main(void)
{
int a;
int *p; //ポインタ変数の宣言
a = 1000;
p = &a; //変数aのメモリアドレスをポインタ変数に代入
printf("変数aの値\t\t: %d\n", a);
printf("変数aのアドレス\t\t: %p\n", &a);
printf("ポインタpの値\t\t: %p\n", p);
printf("ポインタpのアドレス\t: %p\n", &p);
printf("ポインタpの指す値\t: %d\n", *p);
return 0;
}

#include <stdio.h>
int main(void)
{
int a;
int *p;
a = 123;
p = &a;
printf("a = %d\n",a);
printf("ポインタが指し示す値 %d\n",*p);
*p = 789;
printf("ポインタが指し示す値 %d\n",*p);
printf("a = %d\n",a);
return 0;
}
void twice(int *x)
{
*x = x*2; //2倍
}
int main(void)
{
int a = 0;
twice(&a);
printf("a = %d", a);
return 0;
}
void swap(int a, int b)
{
int tmp;
tmp = a;
a = b;
b = tmp;
}
void swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
#include <stdio.h>
int main(void)
{
char c;
[[空欄ア]];
c = 'A';
p = [[空欄イ]];
printf("%c (%p)",[[空欄ウ]]);
return 0;
}
#include <stdio.h>
int main(void)
{
int a=1234567;
int *p;
p = &a;
printf("変数aのアドレス: %p\n", [[空欄ア]]);
printf("変数aの値: %d\n", [[空欄イ]]);
printf("ポインタpの値: %p\n", [[空欄ウ]]);
printf("ポインタpの指す値: %d\n", [[空欄エ]]);
return 0;
}
#include <stdio.h>
int main(void)
{
double x,y,z;
int *p,*q;
p = &x;
q = &y;
printf("X>> ");
scanf("%lf",&p);
printf("Y>> ");
scanf("%lf",&q);
z = *p / *q;
printf("%f/%f = %f\n",x,y,z);
return 0;
}
今週の確認テスト テスト(PDF)
#include <stdio.h>
void sort3(int *a, int *b, int *c); //並べ替え
void swap(int *a, int *b); //交換
int main(void)
{
int a,b,c;
printf("整数(a b c)> ");
scanf("%d %d %d", &a, &b, &c);
sort3( [ 空欄 ] );
printf("%d, %d, %d\n",a,b,c); //結果の表示
return 0;
}