C/C++と
仲良しになるためのn問
@cocodrips
1
自己紹介
2
名前 : くーむ ( o・ω・)ノ
Twitter : @cocodrips
職業 : ゲームプログラマ(2年目)
すきなもの : Python / C++
ブログ : ぴよぴよ.py
C++歴 : 2500行くらい (初心者)
ポインタとは
3
‣ 変数を指す変数
✦ 変数はメモリ上のどこかに配置される
✦ 配置される場所のことをアドレスと言う
Q1.ポインタの基本
5
x ptr
100(アドレス) 116
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
Q1. それそれの値は何になる??
6
x ptr
100(アドレス)
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
10
Q1. それそれの値は何になる??
Q1.ポインタの基本
116
7
x ptr
100(アドレス)
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
10 100
Q1. それそれの値は何になる??
Q1.ポインタの基本
116
8
x ptr
100(アドレス)
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
10 100 100
Q1. それそれの値は何になる??
Q1.ポインタの基本
116
9
x ptr
100(アドレス)
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
10 100 100 116
Q1. それそれの値は何になる??
Q1.ポインタの基本
116
10
x ptr
100(アドレス)
int x = 10;
int *ptr = &x;
x ptr &x &ptr *ptr
10 100 100 116 10
Q1. それそれの値は何になる??
Q1.ポインタの基本
116
11
4 3 10 2 1
100(アドレス) 108
Q2 - 1. *array をcoutするとどうなる?
Q2.ポインタと配列
int array[5] = {4, 3, 10, 2, 1};
104 112 116
1. コンパイルエラー
2. 100
3. 4
12
4 3 10 2 1
100(アドレス) 108
Q2.ポインタと配列
int array[5] = {4, 3, 10, 2, 1};
104 112 116
*array は、
array[0] のエイリアス
1. コンパイルエラー
2. 100
3. 4
Q2 - 1. *array をcoutするとどうなる?
13
4 3 10 2 1
100(アドレス) 108
Q2 - 2. *(array + 4) をcoutするとどうなる?
Q2.ポインタと配列
int array[5] = {4, 3, 10, 2, 1};
104 112 116
1. コンパイルエラー
2. 104
3. 3
4. 1
14
4 3 10 2 1
100(アドレス) 108
Q2 - 2. *(array + 4) をcoutするとどうなる?
Q2.ポインタと配列
int array[5] = {4, 3, 10, 2, 1};
104 112 116
1. コンパイルエラー
2. 104
3. 3
4. 1
array + 4 は array[4]のアドレス
*(array + 4) は
array[4] のエイリアス
15
Q3 - 1. &array が100である時、
arrayの中身はどう配置されてる?
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
0 1 2 3 4 5 6 7 81.
0 1 2 … … 3 4 5 … … 6 7 82.
100(アドレス)
100(アドレス)
16
Q3 - 1. &array が100である時、
arrayの中身はどう配置されてる?
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
0 1 2 3 4 5 6 7 81.
0 1 2 … … 3 4 5 … … 6 7 82.
100(アドレス)
100(アドレス)
17
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
0 1 2 3 4 5 6 7 8
100(アドレス) 104 108 112 116 120 124 128 132
Q3 -2. array[2] をcoutすると、何が表示される?
1. コンパイルエラー
2. 108
3. 124
4. 2
5. 6
18
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
0 1 2 3 4 5 6 7 8
100(アドレス) 104 108 112 116 120 124 128 132
array[2]が指しているのは、
array[2][0]のアドレス。
Q3 -2. array[2] をcoutすると、何が表示される?
1. コンパイルエラー
2. 108
3. 124
4. 2
5. 6
19
Q3 - 3. array[1][2]に一次元でアクセスしたい時、
どうすれば5が表示される?
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
20
Q3.ポインタと多次元配列
int array[3][3] = {{0, 1, 2},
{3, 4, 5},
{6, 7, 8}};
((int*)array)[5];
arrayはint**型で、array[0]の先頭アドレス、
つまりarray[0][0]のアドレスを持っている。
int*型にキャストすれば、一次元でアクセス可能
Q3 - 3. array[1][2]に一次元でアクセスしたい時、
どうすれば5が表示される?
21
Q4. おまけ
int array[5] = {4, 3, 10, 2, 1};
Q4. 何が表示される?
cout << 2[array] << endl;
22
Q4. おまけ
int array[5] = {4, 3, 10, 2, 1};
Q4. 何が表示される?
cout << 2[array] << endl;
10
array[2]は *(array + 2)のエイリアス。
array[2] == *(array + 2)
*(array + 2) == *(2 + array)
*(2 + array) == 2[array]
これまでのお話が書いてある本
23
秘伝C言語問答 ポインタ編
柴田望洋さん
一冊まるごとポインタの話。
ポインタが怖い人への本

C++と仲良くなるためのn問 ~ポインタ編~ #ladiescpp

  • 1.
  • 2.
    自己紹介 2 名前 : くーむ( o・ω・)ノ Twitter : @cocodrips 職業 : ゲームプログラマ(2年目) すきなもの : Python / C++ ブログ : ぴよぴよ.py C++歴 : 2500行くらい (初心者)
  • 3.
  • 4.
    Q1.ポインタの基本 5 x ptr 100(アドレス) 116 intx = 10; int *ptr = &x; x ptr &x &ptr *ptr Q1. それそれの値は何になる??
  • 5.
    6 x ptr 100(アドレス) int x= 10; int *ptr = &x; x ptr &x &ptr *ptr 10 Q1. それそれの値は何になる?? Q1.ポインタの基本 116
  • 6.
    7 x ptr 100(アドレス) int x= 10; int *ptr = &x; x ptr &x &ptr *ptr 10 100 Q1. それそれの値は何になる?? Q1.ポインタの基本 116
  • 7.
    8 x ptr 100(アドレス) int x= 10; int *ptr = &x; x ptr &x &ptr *ptr 10 100 100 Q1. それそれの値は何になる?? Q1.ポインタの基本 116
  • 8.
    9 x ptr 100(アドレス) int x= 10; int *ptr = &x; x ptr &x &ptr *ptr 10 100 100 116 Q1. それそれの値は何になる?? Q1.ポインタの基本 116
  • 9.
    10 x ptr 100(アドレス) int x= 10; int *ptr = &x; x ptr &x &ptr *ptr 10 100 100 116 10 Q1. それそれの値は何になる?? Q1.ポインタの基本 116
  • 10.
    11 4 3 102 1 100(アドレス) 108 Q2 - 1. *array をcoutするとどうなる? Q2.ポインタと配列 int array[5] = {4, 3, 10, 2, 1}; 104 112 116 1. コンパイルエラー 2. 100 3. 4
  • 11.
    12 4 3 102 1 100(アドレス) 108 Q2.ポインタと配列 int array[5] = {4, 3, 10, 2, 1}; 104 112 116 *array は、 array[0] のエイリアス 1. コンパイルエラー 2. 100 3. 4 Q2 - 1. *array をcoutするとどうなる?
  • 12.
    13 4 3 102 1 100(アドレス) 108 Q2 - 2. *(array + 4) をcoutするとどうなる? Q2.ポインタと配列 int array[5] = {4, 3, 10, 2, 1}; 104 112 116 1. コンパイルエラー 2. 104 3. 3 4. 1
  • 13.
    14 4 3 102 1 100(アドレス) 108 Q2 - 2. *(array + 4) をcoutするとどうなる? Q2.ポインタと配列 int array[5] = {4, 3, 10, 2, 1}; 104 112 116 1. コンパイルエラー 2. 104 3. 3 4. 1 array + 4 は array[4]のアドレス *(array + 4) は array[4] のエイリアス
  • 14.
    15 Q3 - 1.&array が100である時、 arrayの中身はどう配置されてる? Q3.ポインタと多次元配列 int array[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 0 1 2 3 4 5 6 7 81. 0 1 2 … … 3 4 5 … … 6 7 82. 100(アドレス) 100(アドレス)
  • 15.
    16 Q3 - 1.&array が100である時、 arrayの中身はどう配置されてる? Q3.ポインタと多次元配列 int array[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 0 1 2 3 4 5 6 7 81. 0 1 2 … … 3 4 5 … … 6 7 82. 100(アドレス) 100(アドレス)
  • 16.
    17 Q3.ポインタと多次元配列 int array[3][3] ={{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 0 1 2 3 4 5 6 7 8 100(アドレス) 104 108 112 116 120 124 128 132 Q3 -2. array[2] をcoutすると、何が表示される? 1. コンパイルエラー 2. 108 3. 124 4. 2 5. 6
  • 17.
    18 Q3.ポインタと多次元配列 int array[3][3] ={{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; 0 1 2 3 4 5 6 7 8 100(アドレス) 104 108 112 116 120 124 128 132 array[2]が指しているのは、 array[2][0]のアドレス。 Q3 -2. array[2] をcoutすると、何が表示される? 1. コンパイルエラー 2. 108 3. 124 4. 2 5. 6
  • 18.
    19 Q3 - 3.array[1][2]に一次元でアクセスしたい時、 どうすれば5が表示される? Q3.ポインタと多次元配列 int array[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  • 19.
    20 Q3.ポインタと多次元配列 int array[3][3] ={{0, 1, 2}, {3, 4, 5}, {6, 7, 8}}; ((int*)array)[5]; arrayはint**型で、array[0]の先頭アドレス、 つまりarray[0][0]のアドレスを持っている。 int*型にキャストすれば、一次元でアクセス可能 Q3 - 3. array[1][2]に一次元でアクセスしたい時、 どうすれば5が表示される?
  • 20.
    21 Q4. おまけ int array[5]= {4, 3, 10, 2, 1}; Q4. 何が表示される? cout << 2[array] << endl;
  • 21.
    22 Q4. おまけ int array[5]= {4, 3, 10, 2, 1}; Q4. 何が表示される? cout << 2[array] << endl; 10 array[2]は *(array + 2)のエイリアス。 array[2] == *(array + 2) *(array + 2) == *(2 + array) *(2 + array) == 2[array]
  • 22.

Editor's Notes

  • #12 配列はこうやって連続的なアドレスに配置される