学習3週間目にてポインタと対峙。
C言語のポインタが難しいとは聞いていましたが、実際最初に見たときはなんのこっちゃと思いました。
悔しいので、ポインタ&配列&値渡しを使用することで、理解できた気になりました。
忘れないようにしつこいくらいコメントも記述。
配列をポインタで渡したいよ!という方の参考になれば。
pointa_hairetu.c
#include <stdio.h>
#include <stdlib.h>
#define A 2//配列の数
int arr_change(int p)
{
//いろいろいじりましたが、毎回*でポインタの定義が関数ごとに必要なようです。
//上記の理由のため、毎回アドレスを渡す必要があります。
int *p2;//*をつけると整数型ポインタ変数(ポインタの数値の中身)
p2 = p;////pのアドレスをp2に代入(アドレス渡しの場合は*はいらない)
printf("配列p2のアドレスは%p",p2);
printf("\n");
for(int i = 0 ; i < A ; i++){
printf("arr_change関数の*p2:[%d]の中身は%d\n",i, *(p2 + i));
}
printf("\n");
for(int i = 0 ; i < A ; i++){
*(p2 + i)=*(p2 + i)*2;//配列の中身を2倍する
printf("*p2:[%d]を2倍した中身は%d\n",i, *(p2 + i));
}
printf("\n");
}
int main(void){
int x[A]; //整数型配列
int *p; //*をつけると整数型ポインタ変数(ポインタの数値の中身)
//配列に数値を代入
x[0] = 1;
x[1] = 100;
p = x; //xのアドレスをpに代入(アドレス渡しの場合は*はいらない)
printf("「p」のアドレスは「 %p 」です\n",p); //「p」の中身 = 「x」のアドレスを表示
printf("「x」のアドレスは「 %p 」です\n",&x); //「x」のアドレスを表示
printf("「x」の中身は「 %d,%d 」です\n",x[0],x[1]); //「x」の中身を表示(10)
printf("\nポインタの中身の取り出し方\nfor(i = 0 ; i < a ; i++)\n{ *(p + i)}\n");
for(int i = 0 ; i < A ; i++){
printf("main関数の*p:[%d]の中身は%d\n",i, *(p + i));
}
printf("\n");
arr_change(p);//配列の引数はポインタを使う
for(int i = 0 ; i < A ; i++){
printf("arr_change関数使用後のmain関数の*p:[%d]の中身は%d\n",i, *(p + i));
}
printf("\n");
printf("この結果をまとめるとなんとarr_changeにて結果をreturnせずとも、\narr_change関数にてポインタ内の数値を直接いじるため\nmain関数の配列も2倍されるのです!\n");
return 0;
}