0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C言語のポインタの恐怖と戦ってみた

Last updated at Posted at 2022-06-14

学習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;

}

0
0
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?