ポインタまとめ

最近 C のポインタについてお勉強中。自分用に学んだことをメモしておきます。

■ pointertest.c

#include <stdio.h>

int main(int argc, char *argv[])
{
  int a = 1;
  int *p;
  int i;

  printf("(1)-----\n");
  printf("&a :%p\n", &a);
  printf(" p :%p\n", p);

  p = &a;
  printf("2.-----\n");
  printf(" p :%p\n", p);
  printf("*p :%d\n", *p);

  *p = 2;
  printf("3.-----\n");
  printf(" a :%d\n", a);

  printf("4.-----\n");
  printf(" main :%p\n", main);

  printf("5.-----\n");
  for(i = 1; i < argc; i++) {
    printf(" argv[%d] : %s, %p\n", i, argv[i], argv[i]);
    //printf(" argv[%d] : %s, %p\n", i, *(argv + i), *(argv + i));
  }

  return 0;
}

■ 実行結果

# gcc -o pointertest pointertest.c 
# ./pointertest a b c
(1)-----
&a :0xbff6ea34
 p :0x804854b
(2)-----
 p :0xbff6ea34
*p :1
(3)-----
 a :2
(4)-----
 main :0x80483f4
(5)-----
 argv[1] : a, 0xbff705d8
 argv[2] : b, 0xbff705da
 argv[3] : c, 0xbff705dc

(1)
・変数 ( ソースの a )は & をつけることで変数へのポインタが取得できる。
・ポインタ変数 ( p ) は宣言には * が必要、ポインタを取得する際は * は不要。変数名そのままで取得できる。

(2)
・ポインタ変数 p に変数 a のポインタを代入。当然、p が指すポインタは a のポインタになる。

(3)
・ポインタ変数の指す先の値は * を付けた変数で取得できる。
・代入も可能で、ソースの例だと 3 の時点で p は a のポインタになっているので *p の値を変更すると a の値が変更される

(4)
・関数もどこかのアドレスに配置される。関数へのポインタは関数名で取得できる。

(5)
・プログラム引数 char *argv[]「char 型へのポインタの配列」ということ。
・argv[i] ( あるいは *(argv + i) ) 各引数へのポインタが取得できる。

※ (5) の理解はちょっとあやしい気もする・・・


本読んでる段階ではわかったつもりになってるんですが、いざ、こうやってまとめてみるとやっぱりあやふやな感じがする・・・難しいですねポインタ・・・

ひとまず今日のところは以上です。

[ 環境情報 ]
CentOS 6.2
GCC 4.4.7