#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;
}