浅分析int*p[]とint(**p)[]の違い


例えば、1)***p[2]は、int型を指すポインタ配列であり、pは、2つの要素を含むポインタ配列であり、ポインタはint型を指す。このようにして使用することができる:

<SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">#include <iostream>
using namespace std;
int main(int argc, char* argv[])
 {
int* p[2];
int a[3] = {1, 2, 3};
int b[4] = {4, 5, 6, 7};
p[0] = a;
p[1] = b;
for(int i = 0; i < 3; i++)
cout << *p[0] + i;// cout << **p + i;
cout << endl;
for(i = 0; i < 4; i++)
cout << *p[1] + i;// cout << **p + i;
return 0;
}</SPAN>
2)int(*p)[2]に対しては、1つの2次元配列の使用法に相当するが、それは1つのn行2列の配列であり、このように使用することができる。2)n*2型の配列のポインタの使い方で、つまり行数が不確定で、列数が確定します。(1)その等価形式については、

<SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">#include <iostream>
using namespace std;
void main() {
int (*p)[2];
int b[3][2] = {{1, 2}, {3, 4}, {5, 6}};
p = b;
for(int i = 0; i < 3; i++) {
for(int j = 0; j < 2; j++) //cout << p[i][j]; //cout << *(*(p+i)+j);
cout << endl;
}
}</SPAN>
は、実際には以上のような使用法、すなわち、私たちがよく使う動的二次元配列の使用法である。