第2回:ポインタ


今週は,C言語を学習する上でもっとも挫折することの多い,でも,C言語のもっともC言語らしいところである,ポインタについて取り上げます.

まずは,その前に前期の復習と行きましょう.


4 入力されたアルファベットの小文字の文字列をabc順に並べ替えるプログラムを作成せよ.

 例:入力された文字列“test”→結果“estt”

#include <stdio.h>

void main()
{
    char s[256], t;
    int n, i, j;

    //文字列の入力
    printf("単語を入力してください\n");
    scanf("%s", s);
    printf("入力された文字列は%sです.\n", s);

    // 文字数を数える
    for(i=0; s[i] != 0x00; i++);
    printf("文字数は,%d文字です.\n", i);

    n = i;

    // 並び替え
    for(i=0; i < n-1; i++){
        for(j=i+1; j < n; j++){
            if(s[i] > s[j]){
                t = s[i];
                s[i] = s[j];
                s[j] = t;
            }
        }
    }

    printf("結果 : %s\n", s);
}

ポインタ変数とは?

データのメモリアドレスを指し示す(ポイントする)ための変数

ポインタ変数の値 = メモリアドレス

  参考 : 普通の変数の値 = 数値や文字


アドレスとは?

変数や配列は,コンピュータのメモリ上にあります.このメモリには,アドレスという連続した番号がついていて,管理されています.

#include <stdio.h>

void main()
{
    char a;
    short b;
    
    printf("aのアドレスは,%x,bのアドレスは%x \n", &a, &b);
}


ポインタ変数の基本的な書式

int *p;
ポインタ変数の宣言.型を指定し,変数名の前に*をつける
p = &a;
pにはint型変数aのアドレスが入る.ポインタ変数にアドレスを入れるには,対象となる変数の前に&をつける
b = *p;
ポインタ変数に格納されているアドレスに格納されているを取り出すには,ポインタ変数の前に*をつける

例:

#include <stdio.h>

void main()
{
    int a,b;
    char *p;

    a = 3;
    p = &a;
    b = *p;

    printf("%d", b);
}

配列とポインタの関係

まずは,例から:

#include <stdio.h>

void main()
{
    char src[20] = "Thank you.";

    int i;
    char *p;

    p = &src[0];

    printf("文字列=");
    for(i=0; src[i] != '\0'; i++){
        printf("%c", *(p+i));
    }
}

ここで, p = &src[0]; とすると,pには配列の先頭のアドレスが入ります.

では,P+1には何が入るでしょう?


ここで,キーボードから文字を入力する命令 scanf を思い出してみよう.

    int a;

    scanf("%d", &a);

この,&aは実はポインタを意味していて,aのアドレスに値を入力していたのです.


今日の演習

1.変数a,bに数字をキーボードから入力し,a+bを求めて表示するプログラムをポインタ変数を使って書き換えよ.

元になるプログラム:

#include <stdio.h>

void main()
{
    int a,b;

    scanf("%d", &a);
    scanf("%d", &b);

    printf("答え:%d\n", a+b);
}

書き換えるプログラム:

#include <stdio.h>

void main()
{
    int a,b;
    int *pa,*pb;

    pa = &a;
    pb = &b;

    scanf("%d",?????);
    scanf("%d",?????);

    printf("答え:%d\n",?????????);
}