C言語:ポインタ突入

| コメント(4) | トラックバック(0)
※C言語初心者の為、内容に不備がある可能性があります。

ポインタ突入。

変数の実際のアドレスを調べるには変数に「&」をつければいいみたい。

「&hoge」は変数hogeのアドレスを表す。

「&」はアドレス演算子って言う。 「アンパサンドのアはアドレスのア!」

printf関数でのアドレスを表す変換指定子は「%p」


/* address01.c */

#include <stdio.h>

int main() {
  char c;
  int i;
  double d, e;
  printf( "変数cのアドレスは%pです\n", &c );
  printf( "変数iのアドレスは%pです\n", &i );
  printf( "変数dのアドレスは%pです\n", &d );
  printf( "変数eのアドレスは%pです\n", &e );
  return 0;
}


実行結果
$ ./address01.exe 
変数cのアドレスは0xbf9ec85fです
変数iのアドレスは0xbf9ec858です
変数dのアドレスは0xbf9ec850です
変数eのアドレスは0xbf9ec848です
この変数のアドレスを格納するための変数がポインタ(pointer)

ポインタを使うためには一般の変数と同じようにブロックの最初に宣言する必要がある。
int 型の変数アドレスを格納するポインタを「pi」とすると

int *pi;

というように宣言する。

「*」これをポイント宣言子(pointer declarator)と言う。


int a, b;
int *pa;

a = 5;
pa = &a;
b = *pa; 


最後の行の「*pa」は変数aの値を表す。
この場合の「*」のことを間接参照演算子
(indirection refarence operator)と言う。
変数の型によってポインタの宣言が違うのは間接参照で値を代入する
ことがあるからでいいのかな?

サンプル。


/* pointer01.c */

#include <stdio.h>

int main() {
  int a;
  int *lpa;
  lpa = &a;

  printf( "適当な数字を入力-----" );
  scanf( "%d", &a );
  printf( "変数aに%dが代入されました。\n", a );
  printf( "変数aのアドレスは%pです。\n", &a );
  printf( "変数aを指しているポインタはlpaです。\n" );
  printf( "*lpaの値は%dです。\n", *lpa );
  return 0;
}

実行結果
$ ./pointer01.exe 
適当な数字を入力-----10
変数aに10が代入されました。
変数aのアドレスは0xbfc5423cです。
変数aを指しているポインタはlpaです。
*lpaの値は10です。
※初期化されていないポインタには何が入っているかわからないよ。

次に参照呼出しの例。
C言語には参照呼出しが無い!
でも引数にアドレスを渡せば同じ効果が得られる。



/* swap.c */

#include <stdio.h>

void swap(int *, int *);

int main() {
  int a, b;

  a = 10;
  b = 20;

  swap( &a, &b );

  printf( "a = %d, b = %d\n", a, b );

  return 0;
}

void swap( int *x, int *y ) {
  int z;

  z = *y;
  *y = *x;
  *x = z;
  return;
}


$ ./swap.exe 
a = 20, b = 10

変数の値を関数に変更してもらうには、変数のアドレスを渡す!

ポインタのポインタ
#include <stdio.h>

int main() {
        int a;
        int *p;
        int **pp;

        p = &a;
        pp = &p;

        **pp = 10;

        printf( "a = %d, *p = %d, **pp = %d\n", a, *p, **pp );

        return 0;
}

実行結果
a = 10, *p = 10, **pp = 10


&とか*とかまだなれないけど意味はわかる。

トラックバック(0)

トラックバックURL: http://www.mogumagu.com/mt/mt-tb.cgi/10

コメント(4)

My developer is trying to convince me to move to .net from PHP. I have always disliked the idea because of the expenses. But he's tryiong none the less. I've been using WordPress on several websites for about a year and am worried about switching to another platform. I have heard fantastic things about blogengine.net. Is there a way I can import all my wordpress posts into it? Any help would be greatly appreciated!

Your website is pretty slow to display when using IE.

Your website is a wee bit slow to show up when using FF.

Is it each night the same with you here? But no employees could be much farther asunder in governmental policies than the Englishman and the American.

2012年1月

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

ウェブページ

このブログ記事について

このページは、モグマグが2010年4月 9日 23:59に書いたブログ記事です。

ひとつ前のブログ記事は「C言語:関数」です。

次のブログ記事は「C言語:配列」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 5.01