次のように、メモリアドレッシングビューから見たいくつかの違いについて説明します。
I.char **p;
p
は double 型のポインタですchar
宣言:
char a = 'g';
char *b = &a;
char **p = &b;
p b a
+------+ +------+ +------+
| | | | | |
|0x2000|------------>|0x1000|------------>| g |
| | | | | |
+------+ +------+ +------+
0x3000 0x2000 0x1000
Figure 1: Typical memory layout assumption
上記の宣言でa
はchar
、文字を含む型g
です。ポインタb
には、既存の文字変数のアドレスが含まれますa
。今b
は住所0x1000
で、*b
文字g
です。最後に のアドレスb
が に代入されるp
ため、a
は文字変数、b
はポインター、p
はポインターへのポインターです。以下の図に示すように、a
値をb
含み、アドレスを含み、アドレスのアドレスを含むことを意味します。p
ここではsizeof(p) = sizeof(char *)
、それぞれのシステムで;
Ⅱ.char *p[M];
p
文字列の配列です
宣言:
char *p[] = {"Monday", "Tuesday", "Wednesday"};
p
+------+
| p[0] | +----------+
0 | 0x100|------>| Monday\0 |
| | +----------+
|------| 0x100
| p[1] | +-----------+
1 | 0x200|------>| Tuesday\0 |
| | +-----------+
|------| 0x200
| p[2] | +-------------+
2 | 0x300|------>| Wednesday\0 |
| | +-------------+
+------+ 0x300
Figure 2: Typical memory layout assumption
この宣言でp
は、 型の 3 つのポインターの配列ですchar
。配列p
が 3 つの文字列を保持できることを意味します。各文字列(Monday, Tuesday & Wednesday)
はメモリ内のどこかにあり、(0x100, 0x200 & 0x300)
アドレスはそれぞれ配列にありp
ます(p[0], p[1] & p[2])
。したがって、それはポインターの配列です。
ノート:char *p[3];
1. p[0], p[1] & p[2] are addresses of strings of type `char *`.
2. p, p+1 & p+2 are address of address with type being `char **`.
3. Accessing elements is through, p[i][j] is char; p[i] is char *; & p is char **
ここsizeof(p) = Number of char array * sizeof(char *)
III. char p[M][N];
p
次の次元の固定長文字列の配列です。M x N
宣言:
char p[][10] = {Monday, Tuesday, Wednesday};
p 0x1 2 3 4 5 6 7 8 9 10
+-------------------------+
0 | M o n d a y \0 \0 \0 \0|
1 | T u e s d a y \0 \0 \0|
2 | W e d n e s d a y \0|
+-------------------------+
Figure 3: Typical memory layout assumption
この場合、配列p
にはそれぞれ 10 文字を含む 3 つの文字列が含まれます。メモリ レイアウトからはp
、 size の文字の 2 次元配列であると言えます。MxN
これは3x10
、この例にあります。char *p[]
これは、文字列の長さが指定されていないためメモリの浪費がなく、長さが等しくない文字列を表すのに役立つ 宣言と比較して、文字列に含まれる文字が 10 文字未満の場合にメモリが浪費される可能性があるため、等しい長さの文字列を表すのに役立ちます。
要素へのアクセスは上記の場合と同様で、p[M]
M 番目の文字列 & p[M][N] は M 番目の文字列の N 番目の文字です。ここsizeof(p) = (M rows * N columns) * sizeof(char)
では2次元配列です。