第7講 箱の住所を代入できる箱(ポインタ)の学習
第3話 ポインタの少し高度な例
#include<stdio.h>
void f();
int main(){
  f();
  return(0);
}
void f(){
  int a,*b;
  a=1;
  b=&a;
  printf("a=%d\n",a);
  printf("a=%d\n",*b);
  printf("*b=%d\n",*b);
  printf("b=%08x\n",b);
  printf("&a=%08x\n",&a);
  a=2;
  printf("a=%d\n",a);
  printf("a=%d\n",*b);
  printf("*b=%d\n",*b);
  printf("b=%08x\n",b);
  printf("&a=%08x\n",&a);
}
コピペ用添付ファイル
の実行画面
a=1
a=1
*b=1
b=0061fe14
&a=0061fe14
a=2
a=2
*b=2
b=0061fe14
&a=0061fe14

えっ???どうして?
*bについては何もしてないのでは?
*bはそのアドレスにある箱の中身を意味していました。
つまり、箱aの中身です。
箱aの中身は、
  a=2;
によって、2に変えられてしまっています。
ですから、
  printf("a=%d\n",*b);
  printf("*b=%d\n",*b);
の実行結果は
a=2
*b=2

となるのです。
  printf("a=%d\n",*b);
  printf("*b=%d\n",*b);
の2行は、箱aについて直接操作するのではなく、
箱aの住所を操作することによって、
箱aの中身を表示させています。
メモリによって変数を操作する!
という芸当が出来ています。
VBAでは出来ない芸当です。
関数の住所から、関数でさえ操れるのです。
第7講の最後でその例を出したいと思います。

では、もう少し高度な例を出しましょう。
#include<stdio.h>
#include <stdlib.h>
void f();
void g();
int main(){
  f();
  g();
  return(0);
}
void f(){
  int x[5],i;
  for(i=0;i<5;i++)x[i]=i+1;
//下に注があります。
  for(i=0;i<5;i++)printf("%d ",x[i]);
  printf("\n");
}
void g(){
  int *x=(int *)malloc(sizeof(int)*5),i;
  for(i=0;i<5;i++)x[i]=i+1;
  for(i=0;i<5;i++)printf("%d ",x[i]);
  printf("\n");
}
コピペ用添付ファイル
(for文は、
  for(i=0;i<5;i++){
    x[i]=i+1;
  }
のように{}中が1文しかないときには、
  for(i=0;i<5;i++)x[i]=i+1;
と書くことが出来ます。

実行画面
1 2 3 4 5
1 2 3 4 5

?ですよね。
次話で詳しく解説しますよ。


第2話へ
 第4話へ


a


初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ