ポインタまとめ
最近 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) の理解はちょっとあやしい気もする・・・
本読んでる段階ではわかったつもりになってるんですが、いざ、こうやってまとめてみるとやっぱりあやふやな感じがする・・・難しいですねポインタ・・・
ひとまず今日のところは以上です。