ababup1192
11/28/2016 - 2:30 AM

pointer.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int i, size;
    int a[10];
    int *p, *q;

    // 仮に配列のサイズをプログラムの実行時に、受け取り 配列に代入する例を考える。
    scanf("%d", &size);

    /*
    もし、sizeが10を越したらアウト
    sizeが10より小さかったら、確保したメモリ領域が無駄になる。

    for (i = 0; i < size; i++)
    {
        scanf("%d", x[i]);
    }
    */

    // pointer3でやった、mallocaをsize分ピッタシ確保する。
    p = (int *)malloc(sizeof(int) * size);

    for (q = p; q < p + size; q++)
    {
        // qは、ポインタ(アドレス)なので、scanfするとき、&をつける必要がない(付けては、いけない)
        scanf("%d", q);
    }

    for (q = p; q < p + size; q++)
    {
        printf("%d ", *q);
    }
    printf("\n");
    
    // 実行例
    // ./a.out
    // 5
    // 1 2 3 4 5

    // 必ず解放
    free(p);

    return 0;
}
#include <stdio.h>
#include <stdlib.h>

int main()
{
    int *p;    
    // ある型がいくつメモリサイズを確保するかは、sizeofを使う
    printf("intのサイズ = %d\n", sizeof(int));

    // 今までは、あらかじめintの変数を用意して参照していたが
    // 実行時に、メモリ領域を確保する。
    p = (int *)malloc(sizeof(int));

    *p = 10; // 領域を参照して、値を代入。

    printf("%d\n", *p);

    // ※ mallocした領域は、使い終わったら解放しなければならない。
    // 普通のint int[] などは、C言語が勝手に解放してくれる。
    free(p);

    return 0;
}
#include <stdio.h>

int main()
{
    int x[10] = {1, 2, 3, 4, 5}; // 配列は、メモリ領域を連続的に確保する。
    char str[10] = "ABCDE";      // 型やマシンによってメモリ領域の確保する値は変わる(テストでは明記されている)
    int *p1;                     // 扱う型によってポインタの型も変える
    char *p2;

    p1 = &x[0]; // 配列の先頭のアドレスをp1に代入
    p2 = str;   // 要素を明示しなくても、先頭のアドレスを渡す。

    // 先頭のアドレスを表示してみる。
    printf("p1 = %p\n", p1);
    printf("p2 = %p\n", p2);

    // ポインタ型のアドレスは、足し算、引き算することができる。その時、アドレスは型の分だけズレる。
    printf("p1 + 1 = %p\n", p1 + 1); // ↑の結果と比べて何バイトずれているか見てみよう。
    printf("p2 + 1 = %p\n", p2 + 1);

    // ずらした分要素を表示してみる。
    printf("*p1, *(p1 + 1) = %d, %d\n", *p1, *(p1 + 1)); // 足してから、アスタリスクで値を参照。
    printf("*p2, *(p2 + 1) = %c %c\n", *p2, *(p2 + 1));
    
    // 実は、配列とポインタは、ほぼおなじ
    printf("*x, *(x + 1) = %d, %d\n", *x, *(x+1)); // x[0], x[1] と同じ。ポインタが面倒なので、書きやすい文法に提供している。

    // アドレスの足し算がわかったので、これを利用して配列のループをポインタスタイルにしてみる。
    int *p, *q;
    p = &x[0];
    
    // xは、要素が5つ
    // qを使ってアドレスをずらすことで値を参照していく。*(q+1) == x[1] を利用する。
    // for(int i=0; i < 5; i++){ x[i] } とやっていることは、同じ。
    for(q = p; q < p + 5; q++){
        printf("%d ", *q);
    }    
    printf("\n");

    return 0;
}
#include <stdio.h>

int main(){
    int x = 1; // int分のメモリ領域を確保して、1という値をメモリに書き込んでいる。
    int *p; // int分のメモリ領域を確保する型(ポインタ)
   
    p = &x; // xのメモリ領域(アドレス)をpに教える。

    printf("%p\n", p); // pはあくまでアドレス(16進数)を保存する型なので、%pでアドレスを表示できる。
    printf("%d\n", *p); // アスタリスクを使うと、アドレスから値を参照出来る。

    return 0;
}