您的位置:首页 > 其它

JM8.6中看起来让人不寒而栗的 int ******究竟是怎么回事?

2012-10-23 22:05 579 查看
       最近又在看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 ******之类东西的可怕。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: