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

       最近又在看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 ******之类东西的可怕。


 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值