#include <iostream>
using namespace std;
int main()
{
    /*
    ** 脑海里要牢记:“*”是取地址内容的操作符,后面的值必须是个地址    ** int *p[2]
    ** 一维数组,数组大小为2,数组的元素是int的指针
    ** 即数组中放的是int *的数据
    */
    int *p[
2];
    int a[
3] = { 
11, 
21, 
31 };
    int b[
4] = { 
41, 
51, 
61, 
71 };   
//此时数组大小不限制
    /*
    ** 注意不能使用p[2],否则数组越界
    ** 如果拿二维数组来理解int *p[2]
    ** 横向数组大小没有限制,纵向则有
    */
    p[0] =
 a;
    p[1] =
 b;
    for ( 
int i = 
0; i < 
3; ++
i )
    {
        cout << *(*(p+
0) + i) << endl;        
//0表示p[0]
    }
    for ( 
int i = 
0; i < 
4; ++
i )
    {
        cout << *(*(p+
1) + i) << endl;        
//1表示p[1]
    }
    cout << 
"****************" <<
 endl;
    /*
    ** 与二维数组的关系
    ** 横向数组大小没有限制,纵向则有
    */
    int c[
2][
3] = { {
11,
21,
31}, {
41,
51,
61} };
    p[0] = c[
0];
    p[1] = c[
1];
    for ( 
int i = 
0; i < 
2; ++
i )
    {
        for ( 
int j = 
0; j < 
3; ++
j )
        {
            cout << *(*(p+i)+j) << 
" " << c[i][j] <<
 endl;
        }
    }
    return 0;
} 
  
  
 没有分割线,似乎不好……
 
  
  
  #include <iostream>
using namespace std;
int main()
{
    /*
    ** int (*p)[2]
    ** 因为q前面有*,所以q需是“地址”
    ** 下面的二维数组c,3可为任意数
    ** 横向大小被限制,纵向大小无限制
    */
    int (*p)[
2];
    int c[
3][
2] = { {
11,
21}, {
31,
41}, {
51,
61} };
    p =
 c;
    for ( 
int i = 
0; i < 
3; ++
i )
    {
        for ( 
int j = 
0; j < 
2; ++
j )
        {
            cout << *(*(p+i)+j) << 
"  " << c[i][j] <<
 endl;
        }
    }
    return 0;
} 
  
 1.这样理解挺华丽丽的
 
 int ** p <==> int p[ x ][ y ]; int *p[ 2 ] <==> int p[ 2 ][ x ]; int ( *p )[ 2 ] <==> int p[ x ][ 2 ];
 
 2.参考资料:http://www.cnblogs.com/carekee/articles/1948326.html
 
转载于:https://www.cnblogs.com/c007136/archive/2012/05/22/2513883.html