第3回:アドレスとポインタ変数 (5/18)

 


課題1

下記の変数のアドレスを調べ,答えなさい。

→ 各自実行して確認する。機種に依存するので,正解はない。


課題2

char c;
int *p;
p = &c;

このコードは,エラーになる。理由を答えなさい。

→ 元の変数の型(char)が,ポインタ変数の型(int)と異なるから。


課題3

値の代入,アドレスの代入

    int a=2, b=3;
    int *pa, *pb;
    
    pa = &a;
    pb = &b;

のとき,次の二つの演算の違いを説明しなさい。
    
    a = b;   → 変数bの中身を,変数aへ代入。
    
    pa = pb;  → 変数aのアドレスを,変数bのアドレスと同じにする。

    

課題4

整数型配列に初期値として,(10,20,30,40,50)を設定したとき,全ての要素の値を表示するプログラムをポインタを用いて作成せよ。


#include <stdio.h>
 
void main()
{
    int a[5] = {10, 20, 30, 40, 50};
    int *p;
    int i;
 
    p = &a[0];
 
    for(i=0; i<5; i++) {
        printf(" 配列の %d 番目は %d です\n", i+1, *(p+i) );
    }
}

課題5

前回の課題3「キーボードから文字列を入力すると,何文字入力されたかを画面に表示するプログラムを作成せよ。」を,ポインタを用いて作成しなさい。

#include <stdio.h>
void main()
{
  int i=0;
  char str[100]; /*  ヌル文字を除く 99 字分の文字の配列を確保  */
  char *pstr;

  pstr = &str[0];
  
  printf("文字を入力してください:");
  
  scanf("%s", pstr);    /*  ここに注意,scanf と ポインタ変数(配列)の関係  */
  
  printf("入力された文字列は%sです\n", pstr);    /*  ここに注意,printf と ポインタ変数(配列)の関係  */
  
  while(*pstr!=NULL){
  pstr++; i++;    /*  ここに注意,一文字ずつ繰り上げていくのは,pstr++,文字数のカウントは i++  */
  }
  
  printf("入力された文字数は,%dです\n", i);
}