プログラム言語 ãƒã‚¤ãƒ³ã‚¿

ãƒã‚¤ãƒ³ã‚¿ã¨ã¯ï¼Ÿ

pointer_purin
pointer_memory
ãƒã‚¤ãƒ³ã‚¿ï¼ãƒã‚¤ãƒ³ã‚¿ã«æ ¼ç´ã•れãŸãƒªãƒ³ã‚¯å…ˆã‚’é éš”æ“ä½œã™ã‚‹æ©Ÿèƒ½

通常変数ã®ãƒã‚¤ãƒ³ã‚¿

ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°pを宣言
int *p ;

注æ„
*p ãŒãƒã‚¤ãƒ³ã‚¿ã§ã¯ãªã„。pãŒãƒã‚¤ãƒ³ã‚¿
ãƒã‚¤ãƒ³ã‚¿ã«ä»£å…¥ã™ã‚‹ã®ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹
宣言時ã®åž‹ã¯æ“作ã™ã‚‹å¤‰æ•°ã®åž‹ã€‚ãƒã‚¤ãƒ³ã‚¿ã«ä»£å…¥ã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯int型。
(ï¼å¤‰æ•°ãƒžã‚¤ã‚³ãƒ³ãƒ”ュータã®åž‹ã€‚ãƒã‚¤ãƒ³ã‚¿ã«ã¯ãƒ¡ãƒ¢ãƒªç•ªåœ°ã§ã‚ã‚‹intåž‹æ•°å€¤ãŒæ ¼ç´ã•れる)

p = (æ“作ã™ã‚‹å¤‰æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹)

変数var ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€&var ã§è¡¨ã•れる。
よã£ã¦ãƒã‚¤ãƒ³ã‚¿pã«var ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´ã™ã‚‹å ´åˆã¯ã€
p = &var ;

å¤‰æ•°ã®æ“作(ãƒã‚¤ãƒ³ã‚¿ã®ãƒªãƒ³ã‚¯å…ˆvar ã‚’é éš”æ“ä½œ)
*p = 3 ;
⇒ var : 3

// ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°å®£è¨€
int *p;
int val = 10;

// valã®ãƒ¡ãƒ¢ãƒªã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´
p = &val;

int *p = 10;
※エラー。ãƒã‚¤ãƒ³ã‚¿ãƒ¼ã«ã¯å¤‰æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã—ã‹æ ¼ç´ã§ããªã„。
リテラルを格ç´ã™ã‚‹äº‹ã¯ã§ãã‚‹(リテラルã®å…ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæ ¼ç´ã•れる)。
「プログラム言語 データ型:文字型・文字列型ã€å‚ç…§

// 16進数表示
printf("0x%x\n", p);
// ⇒0xbdef30(メモリアドレスãŒè¡¨ç¤ºã•れる)
Console::WriteLine(*p);
// ⇒10

// é éš”æ“ä½œ
// pã®ãƒ¡ãƒ¢ãƒªã‚¢ãƒ‰ãƒ¬ã‚¹ã®å¤‰æ•°(=val)ã‚’æ“作
*p = 100;
// 16進数表示
printf("0x%x\n", p);
// ⇒0xbdef30(メモリアドレスãŒè¡¨ç¤ºã•れる)
Console::WriteLine(*p);
// ⇒100(メモリアドレス:åŒã˜ã€å€¤ãŒå¤‰ã‚ã£ã¦ã„ã‚‹)

サブルーãƒãƒ³ã¸ã®ãƒã‚¤ãƒ³ã‚¿æ¸¡ã—
int v = 10;
fnFunc(&v);
→v:11

void fnFunc(int *p)
{

 引数å—ã‘å–り時ã®å‡¦ç†
 vã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´
 p = &v

 
 アドレス元をé éš”æ“ä½œ
 *p += 1;
 
 cout << *p << '\n';
 →11
 
 return;
}

宣言方法
int* p
int *p
※ã©ã¡ã‚‰ã‚‚ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°ã€‚

int* p1, p2 ※p2ã¯é€šå¸¸å¤‰æ•°
int *p1, *p2 ※両方ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°

ヌルãƒã‚¤ãƒ³ã‚¿ãƒ¼
int *p = 0;
アドレスãŒè¨­å®šã•れã¦ã„ãªã„状態を表ã™

int *p = 0;
if (p == 0)
{
 cout << "アドレス未設定\n";
}
else
{
 cout << "アドレス設定済\n";
}

メモリ領域ã®å‹•的確ä¿
メモリアドレスをãƒã‚¤ãƒ³ã‚¿å¤‰æ•°ã«æ ¼ç´
int *p = new int;
ロード時ã§ãªã実行時ã«ãƒ¡ãƒ¢ãƒªé ˜åŸŸãŒç¢ºä¿ã•れるã®ã§ãƒ¡ãƒ¢ãƒªã®ç¯€ç´„ãŒã§ãる。

メモリ領域をé éš”æ“ä½œ
*p = 5;

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory"
 (Destination As Any, Source As Any, ByVal Length As Long)

Dim A As Long
Dim B As Long

A = 5
B = 0

VarPtr(A):Aã®ãƒã‚¤ãƒ³ã‚¿
VarPtr(B):Bã®ãƒã‚¤ãƒ³ã‚¿

'B ↠A ã«ã‚³ãƒ”ー
CopyMemory VarPtr(B), VarPtr(A), Len(B)
MsgBox B
→5

my $x1 = "aaa";

#「$x1ã€ã®ãƒªãƒ•ァレンスをå–å¾—(メモリアドレスをå–å¾—)
my $ref = \$x1;
⇒ $ref : SCALAR(0x1111111)

デリファレンス
リファレンスを使用ã—ã¦å¯¾è±¡ã«ã‚¢ã‚¯ã‚»ã‚¹(é éš”æ“ä½œ)ã™ã‚‹äº‹

my $x = 5;
#リファレンスå–å¾—
my $ref = \$x;
#$xã®å‚照先アドレスをæ“作(デリファレンス)
$$ref *= 10;
⇒ $x : 50

ref()関数
※リファレンスã‹å¦ã‹ï¼Ÿã‚’判定
my $x = 5;
my $ref = \$x; #リファレンスå–å¾—
if (ref($ref)){
  ã“ã“を通る
}

å‚ç…§(リファレンス)

int i = 0;
int &r = i;
※å‚照変数:rã«iã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´

r = 10;
※ rã¯iã‚’å‚ç…§ã—ã¦ã„る→i=10

int ret = i;
※ret:10

サブルーãƒãƒ³ã¸ã®å‚照渡ã—
int v = 10;
fnFunc(v);
→v:11

void fnFunc(int &p)
{
 引数å—ã‘å–り時ã®å‡¦ç†
 vã‚’å‚ç…§
 &p = v

 
 å‚照元をé éš”æ“ä½œ
 p += 1;
 
 cout << p << '\n';
 →11
 return;
}

ãƒã‚¤ãƒ³ã‚¿ã¨å‚ç…§ã®é•ã„
ãƒã‚¤ãƒ³ã‚¿
・å‚照先を何度も変更ã§ãる。
・å‚照先アドレスを設定ã™ã‚‹å ´åˆã¯ã€Œ&ã€ã‚’付ã‘る。
å‚照先アドレスを表ã™ã€Œ&ã€ã¨å‚照変数を表ã™ã€Œ&ã€ã¯é–¢ä¿‚ç„¡ã—。
・å‚ç…§å…ˆã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹å ´åˆã¯ã€Œ*ã€ã‚’付ã‘る。

å‚ç…§
・å‚照先を1度ã—ã‹è¨­å®šã§ããªã„。

é…列ã®ãƒã‚¤ãƒ³ã‚¿


é…列ã®åˆ©ç”¨ã«ã¤ã„ã¦ã¯ã€Œãƒ—ログラム言語 é…列・リスト / é…列ã€å‚ç…§

my @x2 = (1,2,3);

#「@x2ã€ã®ãƒªãƒ•ァレンスをå–å¾—(メモリアドレスをå–å¾—)
my $ref = \@x2;
⇒ $ref : ARRAY(0x1111111)

my @ary = (1,2,3);
#リファレンスå–å¾—
my $ref = \@x;

#デリファレンス
リファレンスã®å‰ã«ã€Œ$ã€ã¾ãŸã¯ã€Œ@ã€ã‚’付ã‘ã‚‹
$$ref[0] *= 10;
@$ref[1] *= 10;
⇒ $ary[0] : 10
⇒ $ary[1] : 20

※ã„ããªã‚Šé…列ã®ãƒªãƒ•ァレンスをå–å¾—ã™ã‚‹æ›¸ãæ–¹
my $ref = [ 1,2,3 ]
#デリファレンス
$$ref[0] *= 10;
⇒ $$ref [0] : 10
⇒ @$ref : 1023

my @ary = (1,2,3);
#リファレンスå–å¾—
my $ref = \@x;
#é…列ã®ãƒ‡ãƒªãƒ•ァレンス
$$ref[0] *= 10; # $ary[0] : 10
${$ref}[1] *= 10; # $ary[1] : 20
$ref->[2] *= 10; # $ary[2] : 30

連想é…列(ãƒãƒƒã‚·ãƒ¥)ã®ãƒã‚¤ãƒ³ã‚¿


ãƒãƒƒã‚·ãƒ¥ã®åˆ©ç”¨ã«ã¤ã„ã¦ã¯ã€Œãƒ—ログラム言語 é…列・リスト / 連想é…列(ãƒãƒƒã‚·ãƒ¥):key-valueåž‹ã€å‚ç…§

my %x3 = ("name","yone","age",35);

「%x3ã€ã®ãƒªãƒ•ァレンスをå–å¾—(メモリアドレスをå–å¾—)
my $ref = \%x3;
⇒ $ref : HASH(0x1111111)

my %x = ("name","yone","age",35);
#リファレンスå–å¾—
my $ref = \%x;
#デリファレンス
$$ref{"name"} = "Mike";
$$ref{"age"} *= 10;
⇒ $x{"name"} : Mike
⇒ $x{"age"} : 350

#リファレンスをDump
print Dumper(\%x);
print Dumper($ref);
⇒{
   name => "yone"
   age => 35
 }

#ã„ããªã‚Šãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスをå–å¾—ã™ã‚‹æ›¸ãæ–¹
my $ref = { "name","yone","age",35 };

#ãƒãƒƒã‚·ãƒ¥ã®ãƒªãƒ•ァレンスをå–å¾—
my $ref = {
  name => "yone",
  age => 35
}

#ãƒãƒƒã‚·ãƒ¥ã®ãƒ‡ãƒªãƒ•ァレンス
print %$ref, "\n"; # ⇒ name"yone"age35
print $$ref{name}, "\n"; # ⇒ "yone"
print ${$ref}{name}, "\n"; # ⇒ "yone"
print $ref->{name}, "\n"; # ⇒ "yone"

関数ãƒã‚¤ãƒ³ã‚¿

通常ã®é–¢æ•°ã§ã¯æˆ»ã‚Šå€¤ã¯ï¼‘ã¤ã®ã¿
main() {
 int var = func(10, 5) ;
}

int func(int x, int y) {
 return x + y ;
}

戻り値ãŒï¼’ã¤æ¬²ã—ã„å ´åˆ

int x ;
int y ;
main() {
 int var = func(10, 5) ;
}

void func(int a, int b) {
 x = a * 10 ;
 y = b * 10 ;
}

ã®æ§˜ã«ã‚°ãƒ­ãƒ¼ãƒãƒ«å¤‰æ•°ã‚’使ã†ã€‚
ã—ã‹ã—ã“ã®æ–¹æ³•ã¯ç¾Žã—ããªã„(分ã‹ã‚Šé›£ãã€æ±Žç”¨æ€§ãŒä½Žãã€ãƒŸã‚¹ã‚‚発生ã—ã‚„ã™ã„)。

関数ãƒã‚¤ãƒ³ã‚¿ä½¿ç”¨ä¾‹(C#)

unsafe void Main() {
 int x = 10 ;
 int y = 15 ;
 func(&x, &y) ;
 int z = x + y;
 ⇒z:250
}

unsafe void func(int *a, int *b) {
 //ãƒã‚¤ãƒ³ã‚¿a ã«x ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´(*a = &x)
 //ãƒã‚¤ãƒ³ã‚¿b ã«y ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´(*b = &y)

 *a = *a * 10 ;
 *b = *b * 10 ;

 //ãƒã‚¤ãƒ³ã‚¿ã«æ ¼ç´ã•れã¦ã„るアドレスã®ãƒªãƒ³ã‚¯å…ˆå¤‰æ•°ã‚’é éš”æ“ä½œã§ãã‚‹
 (x = x * 10)
 (y = y * 10)
}

int main(array<System::String ^> ^args)
{  
  int x = 10;
  int y = 20;
  
  // ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°ã¸ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’渡ã™
  swap(&x, &y);
  
  Console::WriteLine("x:" + x);
  // ⇒20
  Console::WriteLine("y:" + y);
  // ⇒10
  
  return 0;
}

// 値を入れ替ãˆã‚‹
void swap(int *a, int *b)
{
  // ↑ 引数å—ã‘å–り時ã®å‹•ã
  a = &x;
  b = &y;
  
  int tmp = *a; (tmp = x)
  *a = *b; (x=y)
  *b = tmp; (y=tmp)
}

構造体ã®å‚照渡ã—
値渡ã—ã§ã¯æ§‹é€ ä½“ãŒå…¨ã¦ã‚³ãƒ”ーã•れã¦é…ããªã‚‹ç‚ºã€é€Ÿåº¦å‘上を目的ã¨ã—ã¦ãƒã‚¤ãƒ³ã‚¿ã‚’渡ã™
struct MyStruct
{
  int member1 = 10;
  int member2 = 100;
  int member3 = 1000;
} myStruct;

int main(array<System::String ^> ^args)
{  
  myStruct.member1 += 1;
  myStruct.member2 += 1;
  myStruct.member3 += 1;
  
  引数:ãƒã‚¤ãƒ³ã‚¿ã®é–¢æ•°ã¸ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’渡ã™
  myFunc(&myStruct);
  
  return 0;
}

void myFunc(MyStruct *p)
{
  ↑ 引数å—å–æ™‚ã®å‹•ã
  p = &myStruct
  
  構造体ãƒã‚¤ãƒ³ã‚¿ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’å‚ç…§ã™ã‚‹å ´åˆã€ã‚¢ãƒ­ãƒ¼æ¼”ç®—å­ã€Œ->ã€ã‚’使用ã™ã‚‹
  p->member1 += 1; // 12
  p->member2 += 1; // 102
  p->member3 += 1; // 1002
  
  return;
}

// 速度å‘上ã®ç‚ºã«ãƒã‚¤ãƒ³ã‚¿ã‚’渡ã™ãŒã€å¤–部ã‹ã‚‰ã®å¤‰æ›´ã‚’ç¦æ­¢ã™ã‚‹å ´åˆ
void myFunc(const MyStruct *p)
{
  ~
}

関数:fnFunc1ã‚’å‚ç…§ã™ã‚‹é–¢æ•°ãƒã‚¤ãƒ³ã‚¿
void(*p)(int a) = fnFunc1;

関数ãƒã‚¤ãƒ³ã‚¿ã‚’利用ã—ã¦é–¢æ•°ã‚’é éš”実行
p(5);

void fnFunc1(int prm)
{
 return;
}

関数:fnFunc1ã‚’å‚ç…§ã™ã‚‹é–¢æ•°ãƒã‚¤ãƒ³ã‚¿
int(*p)(int a) = fnFunc2;

関数ãƒã‚¤ãƒ³ã‚¿ã‚’利用ã—ã¦é–¢æ•°ã‚’é éš”実行
int ret = p(5);
ret:5

int fnFunc2(int prm)
{
 return prm;
}

sub subroutine {
  return 100;
}

#「subroutineã€ã®ãƒªãƒ•ァレンスå–å¾—
my $ref = \&subroutine;

#デリファレンス(サブルーãƒãƒ³å‘¼ã³å‡ºã—)
my $ret = &$ref;
⇒ $ret : 100

値渡ã—ã§é…列を渡ã™å ´åˆã®ä¸å…·åˆ

my @family = qw/ fam1 fam2 fam3 fam4 /;
my @friend = qw/ fri1 fri2 fri3 fri4 /;

#é…列を渡ã™(値渡ã—)
myAry(@family,@friend);

sub myAry{
  #é…列をå—ã‘å–ã‚‹(値渡ã—)
  my ( @prm1 , @prm2 ) = @_;
  
  print join(',' , @prm1);
  ⇒ fam1,fam2,fam3,fam4,fri1,fri2,fri3,fri4
  print join(',' , @prm2);
  ⇒  #何も表示ã•れãªã„
  
  # @_ ã«ãŠã„ã¦@family 㨠@friend ã®å¢ƒãŒåˆ†ã‹ã‚‰ãªã„為ã«ã€
  é…列内ã®è¦ç´ ãŒå…¨ã¦@prm1ã«å…¥ã£ã¦ã—ã¾ã†äº‹ãŒåŽŸå› ã€‚

}

å‚照渡ã—ã«ã‚ˆã‚‹ä¸å…·åˆã®æ”¹å–„

#リファレンスを渡ã™(å‚照渡ã—)
myAry( \@family , \@friend );

sub myAry{
  #リファレンスをå—ã‘å–ã‚‹(å‚照渡ã—)
  my ( $prm1 , $prm2 ) = @_;
  
  print join(',' , @$prm1);
  ⇒ fam1,fam2,fam3,fam4
  print join(',' , @$prm2);
  ⇒ fri1,fri2,fri3,fri4
}

関数ã¸ã®å‚照渡ã—/ãƒã‚¤ãƒ³ã‚¿æ¸¡ã—

ãƒã‚¤ãƒ³ã‚¿æ¸¡ã—
int v = 10;
fnFunc(&v);
→v:11

void fnFunc(int *p)
{
 引数å—ã‘å–り時ã®å‡¦ç†
 vã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æ ¼ç´
 p = &v

 
 アドレス元をé éš”æ“ä½œ
 *p += 1;
 
 cout << *p << '\n';
 →11
 return;
}

å‚照渡ã—
int v = 10;
fnFunc(v);
→v:11

void fnFunc(int &p)
{
 引数å—ã‘å–り時ã®å‡¦ç†
 vã‚’å‚ç…§
 &p = v

 
 å‚照元をé éš”æ“ä½œ
 p += 1;
 
 cout << p << '\n';
 →11
 return;
}

関数ã‹ã‚‰ã®å‚ç…§å–å¾—/ãƒã‚¤ãƒ³ã‚¿å–å¾—

戻り値ã®å‚ç…§å–å¾—
int x = 10;
int y = 10;

int ret = fnPlus(x, y);
ret:23
x:10
y:10

int& fnPlus(int prm1, int prm2)
{
 static int ret;

 prm1 += 1;
 prm2 += 2;
 ret = prm1 + prm2;
 return ret;
}

戻り値ã®ãƒã‚¤ãƒ³ã‚¿å–å¾—
int x = 10;
int y = 10;

int *ret = fnPlus(&x, &y);
ret:23
x:11
y:12

int* fnPlus(int *prm1, int *prm2)
{
 &prm1 = &x;
 &prm2 = &y;

 int ret;
 *prm1 += 1;
 *prm2 += 2;
 ret = *prm1 + *prm2;

 return &ret;
}

voidãƒã‚¤ãƒ³ã‚¿

int x = 10;
void *p1;
int *p2 = &x;

p2 = p1; //×
通常ã®ãƒã‚¤ãƒ³ã‚¿ã«ã€voidãƒã‚¤ãƒ³ã‚¿ã‚’æ ¼ç´ã§ããªã„

p2 = static_cast(p1); //â—‹
voidãƒã‚¤ãƒ³ã‚¿ã‚’æ ¼ç´å…ˆãƒã‚¤ãƒ³ã‚¿ã®åž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã™ã‚Œã°OK

p1 = p2; //â—‹
voidãƒã‚¤ãƒ³ã‚¿ã«ã¯ã€é€šå¸¸ãƒã‚¤ãƒ³ã‚¿ã‚’æ ¼ç´ã§ãる。

å–å¾—ã™ã‚‹å€¤ã‚’ä¿æŒã€‚後ã§åž‹ã‚’指定ã™ã‚‹ã€‚
int x = 10;
void *p = &x;

cout << *p << '\n'; //×
コンパイルエラー:voidãƒã‚¤ãƒ³ã‚¿ãƒ¼ã¯å‚照先をå‚ç…§ã§ããªã„
cout << *static_cast(p) << '\n'; //○
voidãƒã‚¤ãƒ³ã‚¿ã‚’å‚ç…§å…ˆãƒã‚¤ãƒ³ã‚¿ã®åž‹ã«ã‚­ãƒ£ã‚¹ãƒˆã™ã‚Œã°OK

int v1 = 1;
char v2 = 'a';
double v3 = 1.23;

void *p;

p = &v1;
cout << *static_cast<int*>(p) << '\n';
→ 1

p = &v2;
cout << *static_cast<char*>(p) << '\n';
→ 'a'

p = &v3;
cout << *static_cast<double*>(p) << '\n';
→ 1.23

メンãƒãƒ¼ãƒã‚¤ãƒ³ã‚¿ãƒ¼

class MyClass
{
public:
 int myInt;
};

int _tmain(int argc, _TCHAR* argv[])
{

 MyClass m1;
 m1.myInt = 10;
 m1.myInt:10
 
 
 MyClass m2;
 int MyClass::*p2;
 
 p2 = &MyClass::myInt;
 m2.*p2 = 20;
 m2.myInt:20
 
 
 MyClass m3;
 int MyClass::*p3 = &MyClass::myInt;
 
 m3.*p3 = 30;
 m3.myInt:30
 
 return 0;
}

メンãƒãƒ¼é–¢æ•°ãƒã‚¤ãƒ³ã‚¿ãƒ¼

class MyClass
{
public:
 int fnPlus(int prm1, int prm2){
  return prm1 + prm2;
 };
};

int _tmain(int argc, _TCHAR* argv[])
{

 MyClass m1;
 int ret = m1.fnPlus(5, 10);
 ret:15
 
 
 MyClass m2;
 int (MyClass::*f2)(int prm1, int prm2);
 
 f2 = &MyClass::fnPlus;
 ret = (m2.*f2)(15, 20);
 ret:35
 
 
 MyClass m3;
 int (MyClass::*f3)(int prm1, int prm2) = &MyClass::fnPlus;
 ret = (m3.*f3)(25, 30);
 ret:55
 
 return 0;
}

ãƒã‚¤ãƒ³ã‚¿ã®å‚照先変更

int var1 ;
int var2 ;
int *p ;

p = &var1 ;
*p = 3 ;
⇒var1 : 3

p = &var2 ;
*p = 5 ;
⇒ var2 : 5

int val1 = 10;
int val2 = 20;

// ãƒã‚¤ãƒ³ã‚¿å®£è¨€
int *p;
p = &val1;
*p = 100; // val1:100

// å‚照宣言(宣言ã¨åŒæ™‚ã«åˆæœŸåŒ–ãŒå¿…è¦)
// メモリアドレス未設定ã®ã¾ã¾ãƒã‚¤ãƒ³ã‚¿ã‚’使用ã—ã¦ã‚·ã‚¹ãƒ†ãƒ ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã™ã‚‹ãƒŸã‚¹ã‚’ç„¡ãã›ã‚‹
int &refx = val1;
refx = 200; // val1:200

p = &val2;
*p = 300; // val2:300

↓エラー:å‚ç…§ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹å¤‰æ›´ä¸å¯
&refx = val2;
refx = 400;

ãƒã‚¤ãƒ³ã‚¿ã®å•題点

struct Program {
 char* name;
 int experience;
}
Program* p = (Program*)malloc(sizeof(Program)*3);
Program構造体ã®ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°ã‚’宣言
 Program構造体オブジェクト×3個分ã®ãƒ¡ãƒ¢ãƒªé ˜åŸŸã‚’ヒープ領域ã«ä½œæˆ
 ã“ã®é ˜åŸŸã®ãƒã‚¤ãƒ³ã‚¿ã‚’ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°pã¸æ ¼ç´

p[0].name = "php";
p[0].experience = 1;
p[1].name = "Java";
p[1].experience = 2;
p[2].name = "C#";
p[2].experience = 3;

for(i=0; i<10; i++){
 printf(p);アドレスを表示
 printf(p=>name;
 printf(p=>experience;
 p++;ãƒã‚¤ãƒ³ã‚¿ã‚’インクリメント
}

çµæžœ
a050210 php 1
a050218 Java 2
a050220 C# 3
a050228 AAA 0 â†é–¢ä¿‚ãªã„データãŒå‡ºåŠ›ã•れる
a050230 CCC 9 â†é–¢ä¿‚ãªã„データãŒå‡ºåŠ›ã•れる

アドレス

a050210 p[0] åå‰ çµŒé¨“
a050218 p[1] åå‰ çµŒé¨“
a050220 p[2] åå‰ çµŒé¨“
a050228 p[3] 関係ãªã„データ
a050230 p[4] 関係ãªã„データ

・ãƒã‚¤ãƒ³ã‚¿ã®åŠ æ¸›ã«ã‚ˆã£ã¦é–¢ä¿‚ç„¡ã„メモリをå‚ç…§ã§ãã¦ã—ã¾ã†
 便利ã€é«˜é€Ÿã®åé¢ã€ãƒã‚°ã€æ‚ªç”¨ã®åŽŸå› ã«ã‚‚ãªã‚‹
・ヒープ領域ã®ã‚ªãƒ–ジェクトを削除ã—忘れる

Follow me!