第6回 ポインタ

基本課題

ポインタ

★f1) int型の変数aとint型へのポインタpを定義し、pを用いてaに好きな値(キーボードから入力した整数)を代入するプログラムを作成しなさい。※直接aに値を代入せず、pを使ってaの値を変える。

int a;
int *p;

【ポイント】 ポインタは必ず変数などのある有効なメモリ領域を指していなければならない。初期化していないポインタは非常に危険である。※下記は課題とは関係ない。

char str[20];
char *ptr;
ptr = &str[3];

f2) まず,int型の変数a,bに適当な整数を代入しておく。次に,pをaへのポインタ,qをbへのポインタとする。そして,pとqを使って(a,bを使わずに)変数a,bの内容を入れ替えなさい。結果を確認するため,入れ替える前と後の変数a,bの値を表示しなさい。

★f3) 整数型の配列a[10]と,整数型へのポインタpを定義し,配列の要素a[3]に適当な値を代入し,pにa[3]のアドレスを代入する。このときのa[3],&a[3], *p, pを表示すること。その後,*pに別の値を代入するとどうなるかも同様に表示しなさい。

【ポイント】 ポインタの値(アドレス)を表示するには%pを用いる。

printf("%p\n", ptr);

f4) キーボードから入力された文字列を char 型への配列 str に読み込み、char型へのポインタ ptr を用いて、str 内の1文字目から最後までの文字列、2文字目から最後までの文字列、3文字目から最後までの文字列、…を順に出力するプログラムを作成せよ。以下に出力例を示す。

Tamagawa
amagawa
magawa
agawa
gawa
awa
wa
a

★f5) 2つの整数x,yを引数に取り、商と余りを同時にもとめる関数divideを作成しなさい。なお、y=0なら0を返し,それ以外なら1を返すようにしなさい。

int divide(int x, int y, int *sho, int *amari);

使用例

int a, b, c;
c = divide(5, 3, &a, &b);
if (c != 0) printf("商 %d  余り %d\n", a, b);

応用課題

fx1) 長さ5のint型,char型の配列を作り,各要素に適当な値を代入しなさい。それぞれの配列について,ポインタを使って配列の要素のアドレスと中身を1つずつ表示しなさい。

fx2) 長さ10文字のchar型の配列fromとtoを定義し、キーボードからfromに文字列を読み込んだ後、ポインタ2つを用いてtoにこの文字列をコピーするプログラムを作成しなさい。

【ポイント】 ポインタによる連続コピーでは、よく以下のような書き方が用いられる。

*p++ = *q++;

fx3) 整数型へのポインタを2つ取り、それらの指す整数値を交換する関数swapを作成せよ。

void swap(int *p, int *q);

使用例

int a = 3, b = 5;
swap(&a, &b);
printf("a=%d b=%d\n", a, b);

fx4) 2つの文字列を比較し,同じなら1,異なる場合は0を返す関数を作成しなさい。※ただし,標準ライブラリ関数strcmpは用いないこと。

int strequal(char *str1, char *str2);

fx5) キーボードから文字列patternとstringを読み込み、stringにpatternが含まれる場合には「成功」と表示して終了し、含まれない場合には「失敗」表示として成功するまでstringの読み込みを繰り返すプログラムを作成しなさい。※標準ライブラリ関数strstrを使ってよいので調べてみよ。

発展課題


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS