10. ポインタの基礎

10. ポインタの基礎#

Source code#

変数のアドレスの表示

#include <stdio.h>
int main(void)
{
    int mydt = 1234;
    printf("The value of mydt is %d\n", mydt);
    printf("The address of mydt is %p\n", &mydt);
    return 0;
}

ポインタの宣言と初期化

#include <stdio.h>
int main(void)
{
    int *p;
    int mydt = 1234;
    p = &mydt;
    printf("The value of mydt is %d\n", mydt);
    printf("The address of mydt is %p\n", &mydt);
    printf("The value of p is %p\n", p);
    printf("The value of *p is %d\n", *p);
    return 0;
}

ポインタと配列

#include <stdio.h>
int main(void)
{
    int ary[5] = {100, 200, 300, 400, 500};
    int *p;

    p = &ary[0];
    printf("pt=%p\n", p);
    p = ary;
    printf("pt=%p\n", p);
    return 0;
}

ポインタ演算

#include <stdio.h>
int main(void)
{
    int n, ary[3] = {100, 110, 120};
    int *pt = ary;
    n = *pt; // nは100になる
    printf("%d\n", n);
    n = *(pt + 1); // nは110になる
    printf("%d\n", n);
    n = *(pt + 2); // nは120になる
    printf("%d\n", n);
    return 0;
}

Problem#

Problem 1. A~Cを適切に埋め,プログラムを実行せよ.

#include <stdio.h>
int main(void)
{
    int aa, bb;
    int *pt;
    aa = 123;
    pt = /*A 変数aaのアドレスを設定*/
    bb = /*B ポインタptの指すアドレスにある値を設定*/
    printf("aa=%d *pt=%d bb=%d\n", aa, *pt, bb);
    pt = /*C 変数bbのアドレスを設定*/
    *pt = 999;
    printf("aa=%d *pt=%d bb=%d\n", aa, *pt, bb);
    return 0;
}

Problem 2. 下の?に適当なプログラムを書いて,キーボードから入力されたxの値をyにもコピーせよ.ただし,y=x; を書いてはいけない.

#include <stdio.h>
int main(void)
{
    int x, y, *p;
    printf("x=");
    // ??
    // ??
    // ??
    printf("x=%d y=%d\n", x, y); // 同じ値の結果を出す
    return 0;
}

Problem 3. 下線部を埋めて,入力した5文字が逆順で表示されるようにせよ.ただし,sを使ってはいけない.pとiは使ってよい.

#include <stdio.h>
int main(void)
{
    int i;
    char s[6], *p;
    printf("Input 5 characters: ");
    fgets(s, 6, stdin);
    p = s;
    for (i = 0; i < 5; i++)
    {
        printf("%c", ________); /* p[4-i]でも良い */
    }
    printf("\n");
    return 0;
}

Problem 4. 入力した文字列を一文字ずつ表示させるプログラムを作れ.ただし,ポインタを使うこと.

#include <stdio.h>
int main(void)
{
    char s[20], *p;
    printf("Input a string(max.19): ");
    fgets(s, 20, stdin);
    // ???
    // ???
	// ???
    // ???
	// ???
    // ???
    return 0;
}

Solutions#

#include <stdio.h>
int main(void)
{
    int aa, bb;
    int *pt;
    aa = 123;
    pt = &aa; /*変数aaのアドレスを設定*/
    bb = *pt; /*ポインタptの指すアドレスにある値を設定*/
    printf("aa=%d *pt=%d bb=%d\n", aa, *pt, bb);
    pt = &bb; /*変数bbのアドレスを設定*/
    *pt = 999;
    printf("aa=%d *pt=%d bb=%d\n", aa, *pt, bb);
    return 0;
}
#include <stdio.h>
int main(void)
{
    int x, y, *p;
    printf("x=");
    scanf("%d", &x);
    p = &x;
    y = *p;
    printf("x=%d y=%d\n", x, y); // 同じ値の結果を出す
    return 0;
}
#include <stdio.h>
int main(void)
{
    int i;
    char s[6], *p;
    printf("Input 5 characters: ");
    fgets(s, 6, stdin);
    p = s;
    for (i = 0; i < 5; i++)
    {
        printf("%c", *(p + 4 - i)); /* p[4-i]でも良い */
    }
    printf("\n");
    return 0;
}
#include <stdio.h>
int main(void)
{
    char s[20], *p;
    printf("Input a string(max.19): ");
    fgets(s, 20, stdin);
    p = s; /* p = &s[0]と同じ */
    while (*p != '\0')
    {
        printf("%c ", *p);
        p++;
    }
    return 0;
}