以前,我对于双指针所指向的对象究竟是什么、如何初始化双指针等问题一直搞不清楚。今天看了UIUC的教学视频,终于搞明白了。若觉得下面的中文描述不够清楚,请看文章最后的英文描述。
在看双指针之前,先来看看最简单的单指针:
int *X
对于*X,有两种可能(理论上应该说*X指向什么,但为了后面方便理解,这里我们改口为 “ *X是什么 ”):
1. *X是一个整型实例,初始化:X = &(whatever int object)
2. *X是一个整型动态数组 X = new int [size]
那么我们再来看双指针:
int **X
它有4种可能性。(为什么?单指针2种,双指针就是2x2种,n重指针就是2^n种)
1. **X是一个整型实例(X里存的是*X的地址,而*X里存的是一个整型实例的地址)
一层初始化:X = new int *;
二层初始化:*X = new int;
2. **X是一个指针,它指向一个整型的动态数组:
一层初始化:X = new int *;
二层初始化:*X = new int [ size ] ;
3. **X是一个动态数组,在这个动态数组里,每一个元素都是一个整型的动态数组:
一层初始化:X = new int* [ size1 ] ;
二层初始化:for( i=0; i<size1; i++)
X [ i ] = new int [ size2 ] ;
4. **X是一个动态数组,在这个动态数组里,每个元素都是一个指针,每个指针都指向一个整型实例
一层初始化: X = new int* [ size ] ;
二层初始化: for( i=0; i<size; i++ )
X[i] = new int;
The four meanings of double pointers: png **p
1). Pointer to a dynamic array of pngs
p = new png*;
*p = new png[size];
2). Pointer to a pointer to a png
p = new png*;
*p = new png;
3). A dynamic array of dynamic arrays of pngs
p = new png*[size1];
for(i=0;i<size1; i++)
p[i] = new png[size2];
4). A dynamic array of pointers to pngs
p = new png*[size];
for(i=0; i<size;i++)
p[i] = new png;
Why are there four: What could int *x be? It could eitherbe a pointer to int, or a dynamic array of ints. So double pointer is 2x2,trible pointer is 2x2x2.