JM8.6中看起来让人不寒而栗的 int ******究竟是怎么回事?
2012-10-23 22:05
579 查看
最近又在看H.264的编码器JM8.6, 遇到了很多类似于int ******这样的指针,看起来让人不寒而栗,其实也不过如此,下面用实例来剖析一下:(特此说明一下:为了让程序更简单,下面的程序省略了释放内存的部分)
程序1:
上述程序是很傻的,我们可以抽象,如下:
程序2:
由于*(a + i)与a[i]无条件等价,故上述程序可以改为:
程序3:
至此,看出了联系了吧:本质上是一维指针,形式上是一维数组! 继续看:
程序4:
同理,上述的a, b, c, d很麻烦,可以抽象:
程序5:
下面给出三维指针对应的程序:
程序6:
下面给出四维指针对应的程序:
程序7:
至于更多维的指针,依次类推即可,在JM8.6中,好多地方就有高维指针。先用栈指针x指向堆,在后续用的时候,完全把x当成是数组,这样挺好的,至少不会让你感觉到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 ******之类东西的可怕。
相关文章推荐
- JM8.6中看起来让人不寒而栗的 int ******究竟是怎么回事?
- 哈希究竟是怎么回事!
- 词向量与Embedding究竟是怎么回事?
- 在C#中,string 类型可与SQL SERVER中的int 类型作比较,是怎么回事?
- 词向量与Embedding究竟是怎么回事?
- JM8.6编码器中的Configure函数究竟做了什么?(编程思想:抽象,间接)
- JM8.6代码中究竟是如何把码流写进test.264文件的?
- iOS 4 的多任务究竟是怎么回事?
- IE6里的元素间的距离变大是怎么回事?
- 某网站出现自己电脑的搜索记录,这是怎么回事呢?
- 磁盘空间低,是怎么回事
- 闲聊:项目延期,怎么回事?
- MyEclipse的Package Explorer中工程前面的红色感叹号是怎么回事
- 手机用久了就慢,卡到不行,怎么回事?三招帮你搞定!
- 迅雷狂跌无止境:下载神器究竟怎么了?
- openssl heartbeed到底是怎么回事?
- 这个表是怎么回事??? [问题点数:50分] 收藏
- Visual Studio 2008 响应很慢 是怎么回事?
- c# - catch(Exception ex) 会丢掉StackTrace 是怎么回事?
- 帮忙看看,怎么回事?不懂啊。。。。。。