見出し画像

C言語のポインタの学び直し

タイトル絵意味なし。今回はC言語のお話。

娘ちゃんがC言語を触り始めたので、つまずくであろうポインタについて、
いつ聞かれても良いように、20数年ぶりにC言語を触ってみる。

paiza.ioで気軽に実行環境が用意されているのはありがたいですね。
https://paiza.io/ja/projects/new
事前準備いらず。初学者にとっては心強いサービスです。

早速書いてみましょう。

 #include  <stdio.h>
int main(void){

    int j[]={256,512,1024}; //とりあえず配列jを作成して3つの数値を放り込む
    int *p_j =j;       //配列を指すポインタ*p_jを宣言しjをポイント

  //まずは普通にポインタ*p_jをプリント。ついでにアドレスもプリント
    printf("%d\n",*p_j);
    printf("%lu\n",p_j);

  //アドレスであるp_jをインクリメントして、ポインタ*p_jをプリント
    p_j++;
    printf("%d\n",*p_j);
    printf("%lu\n",p_j);

  //*p_jをインクリメントできるか実験
    *p_j++;
    printf("%d\n",*p_j);
    printf("%lu\n",p_j);
    
return 0;
    
}

出力結果

256
140726964120488

512
140726964120492

1024
140726964120496

*p_jが指している先は配列jの先頭のため、256が出力される。

p_j++でアドレスp_jをインクリメントすると、
*p_jが指すのは配列jの2つめの要素。512が出力される。

++でアドレスをインクリメントするとアドレス値は4つ増えているので
int型のサイズは4バイトということがわかりますね。
意識していないけどインクリメントでちゃんと4バイト増分するのはありがたい。

最後に*p_j++の結果。
出力されるのは配列jの3つめの要素である1024でした。

*p_j++は*p_jが指していた512のインクリメントではないのですね。
動作としては、 *p_j++  →  *( p_j=p_j+1) 
ということで、ポインタが指している値ではなく、アドレスをインクリメントしたもののポインタ。と解釈される仕様でした。

とりあえず、基本動作は思い出したのでちょっとした質問には応えられそうです。参照渡しでもなんでもどんとこい!
まだif,for文と1次配列くらいしかやってないので、もう少し進むと目論見通りつまずいてくれるかしら。ストレートに理解してくれるのが一番良いのですけどね。

この記事が気に入ったらサポートをしてみませんか?