最近又在看H.264的编码器JM8.6, 遇到了很多类似于int ******这样的指针,看起来让人不寒而栗,其实也不过如此,下面用实例来剖析一下:(特此说明一下:为了让程序更简单,下面的程序省略了释放内存的部分)
程序1:
#include<iostream>
using namespace std;
int main()
{
int a = 0;
int b = 1;
int c = 2;
int d = 3;
int e = 4;
int f = 5;
int g = 6;
int h = 7;
int i = 8;
int j = 9;
cout << a << b << c << d << e << endl;
cout << f << g << h << i << j << endl;
return 0;
}
上述程序是很傻的,我们可以抽象,如下:
程序2:
#include<iostream>
using namespace std;
int main()
{
int *a = NULL;
a = new int[10];
int i;
for(i = 0; i < 10; i++)
*(a + i) = i;
for(i = 0; i < 10; i++)
cout << *(a + i) << endl;
return 0;
}
由于*(a + i)与a[i]无条件等价,故上述程序可以改为:
程序3:
#include<iostream>
using namespace std;
int main()
{
int *a = NULL;
a = new int[10];
int i;
for(i = 0; i < 10; i++)
a[i] = i;
for(i = 0; i < 10; i++)
cout << a[i] << endl;
return 0;
}
至此,看出了联系了吧:本质上是一维指针,形式上是一维数组! 继续看:
程序4:
#include<iostream>
using namespace std;
int main()
{
int i;
int *a = NULL, *b = NULL, *c = NULL, *d = NULL;
a = new int[10];
b = new int[10];
c = new int[10];
d = new int[10];
for(i = 0;i < 10; i++)
{
a[i] = i;
b[i] = 10 * i;
c[i] = 20 * i;
d[i] = 30 * i;
}
for(i = 0;i < 10; i++)
cout << a[i] << " ";
cout << endl;
for(i = 0;i < 10; i++)
cout << b[i] << " ";
cout << endl;
for(i = 0;i < 10; i++)
cout << c[i] << " ";
cout << endl;
for(i = 0; i < 10; i++)
cout << d[i] << " ";
cout << endl;
return 0;
}
同理,上述的a, b, c, d很麻烦,可以抽象:
程序5:
#include<iostream>
using namespace std;
int main()
{
int i, j;
int **x = NULL;
x = new int * [4]; //不能写成 x = new (int*) [10];
for(i = 0; i < 4; i++)
x[i] = new int[10];
for(j = 0; j < 4; j++)
for(i = 0; i < 10; i++)
if(0 == j)
{
x[j][i] = i; // 经网友提醒后, 增加这个分支, 多谢网友啊。
}
else
{
x[j][i] = 10 * i * j;
}
for(j = 0; j < 4; j++)
{
for(i = 0;i < 10; i++)
cout << x[j][i] << " ";
cout << endl;
}
return 0;
}
下面给出三维指针对应的程序:
程序6:
#include<iostream>
using namespace std;
int main()
{
int i, j, k;
int ***x = NULL;
x = new int** [3];
for(i = 0; i < 3; i++)
x[i] = new int* [3];
for(i = 0;i < 3; i++)
for(j = 0;j < 3; j++)
x[i][j] = new int[3];
for(i = 0; i < 3; i++)
for(j = 0;j < 3; j++)
for(k = 0; k < 3; k++)
x[i][j][k] = 9 * i + 3 * j + k;
for(i = 0;i < 3; i++)
for(j = 0; j < 3; j++)
for(k = 0; k < 3; k++)
cout << x[i][j][k] << endl;
return 0;
}
下面给出四维指针对应的程序:
程序7:
#include<iostream>
using namespace std;
int main()
{
int i, j, k, m;
int M = 4;
int ****x = NULL;
x = new int***[M];
for(i = 0; i < M; i++)
x[i] = new int**[M];
for(i = 0; i < M; i++)
for(j = 0; j < M; j++)
x[i][j] = new int*[M];
for(i = 0; i < M; i++)
for(j = 0; j < M; j++)
for(k = 0; k < M; k++)
x[i][j][k] = new int[M];
for(i = 0; i < M; i++)
for(j = 0;j < M; j++)
for(k = 0; k < M; k++)
for(m = 0; m < M; m++)
x[i][j][k][m] = 64 * i + 16 * j + 4 * k + m;
for(i = 0; i < M; i++)
for(j = 0; j < M; j++)
for(k = 0; k < M; k++)
for(m = 0; m < M; m++)
cout << x[i][j][k][m] << endl;
return 0;
}
至于更多维的指针,依次类推即可,在JM8.6中,好多地方就有高维指针。先用栈指针x指向堆,在后续用的时候,完全把x当成是数组,这样挺好的,至少不会让你感觉到int ******之类东西的可怕。