[C言語] ポインタの利用

#include<stdio.h>

int main(void) {
    int *p;
    int k = 123456;
    int t;

    p = &k;
    t = *p;

    printf("p=%p, t=%d\n", p, t);

    return 0;
}

$ gcc main.c -o main && ./main
p=0xfffff6a796e8, t=123456

&kはアドレスで、ポインタを代入は値の代入になる

### 割り当てられていない領域をアクセス

int main(void) {
    int *p;
    int k = 123456;
    int t;

    p = &k;
    p++;
    t = *p;

    printf("p=%p, t=%d\n", p, t);

    return 0;
}

p=0xffffd0f0d40c, t=65535
pのアドレスを一つ進めているので、異なる値が表示される

### 割り当てられている領域をアクセス

int main(void) {
    int *p;
    int k[2] = {12345, 67890}; // 配列
    int t;

    p = &k[0];
    p++;
    t = *p;

    printf("p=%p, t=%d\n", p, t);

    return 0;
}

$ gcc main.c -o main && ./main
p=0xfffff62356e4, t=67890
配列の場合は、ポインタを一つ進めると、配列の次の値となる。

int main(void) {
    int *p;
    int k[2] = {12345, 67890}; // 配列
    int t;

    p = k;
    p++;
    t = *p;

    printf("p=%p, t=%d\n", p, t);

    return 0;
}

$ gcc main.c -o main && ./main
p=0xffffecd87384, t=67890

配列kは、kの先頭アドレスを指す

int main(void) {
    int *p;
    int k[3] = {111, 222, 333}; // 配列
    int t;

    p = &k[1];
    p++;
    t = *p;

    printf("p=%p, t=%d\n", p, t);

    return 0;
}

$ gcc main.c -o main && ./main
p=0xffffc27bcfc0, t=333

これは説明不要

int main(void) {
    int *p;
    int k[3] = {111, 222, 333}; // 配列
    int i;

    p = k;
    for(i =0; i < 3; i++){
        int value = *p++;
        printf("value=%d\n", value);
    }

    return 0;
}

$ gcc main.c -o main && ./main
value=111
value=222
value=333

配列の先頭アドレスから出力している
配列をポインタに代入して、ポインタを進めることで、配列の値を出力するというのは多用できそうですね。