烦人的数组 二维数组 数组的引用,该怎么解决

烦人的数组 二维数组 数组的引用
一:指向二维数组的指针:
int(*p)[5]这个指针 是指向一个N行5列的二维数组的指针

下面看数组的引用:
int(&r)[5] 是int a[5]这个数组的引用

那我就有点看不明白了 int(*p)[5]对应的是2维数组 而int(&r)[5]对应的却是一个一维数组????它们不都是int(...)[5]这种形式的吗 为啥会有这么大的差别 这在c++标准中有规定吗??

二:int a[5] 这个a就是个a[0]的地址 换句话更精确是话说 它就是个const int* p;那为什么不能这样对它进行引用呢:
const int* &rp = a;// 这句话会提示两边的数据类型不匹配 说a的数据类型是int[5];那既然a的数据类型是int[5] 那为什么又能被int*p = a;这样写呢???



------解决方案--------------------
数组名就是代表一个数组.数组名可以隐式转换成首元素的指针(指针不是地址!!!)

数组与指针
http://topic.csdn.net/u/20091123/11/0c03d2e2-0655-4634-8287-0e2315d889fc.html?91173

其实在C数组都是一维的..


int arr[3];
arr 是数组名,可以隐式转换成首元素的指针,这时元素类型是int,所以可以转换成int*
int* p = arr;//正确.
int*p = &arr[0];//与上面效果一样.

int arr2[3][2];
arr2 是数组名,可以隐式转换成首元素的指针,这时元素类型是int [2];//是一个一维数组.所以可以转换成int(*)[2];//指向数组的指针.

int (*p)[2]=arr2;//正确.
int (*p)[2] = &arr2[0];//与上面效果一样.



对于*arr是怎么理解的?



*arr;//很明显,数组本身是不存在*(解引用)操作的.于是数组转换成首元素的指针,再被解引用.

*(arr + 0)//这样写也是一样的.不过这里是因为加法操作而转换成指针.


实际上,除了在sizeof(),和&操作之外,其他情况都会转换成指针.

你试试:
int arr[3];
sizeof(arr);
int * p = &arr;//错;
int (*P)[3] = &arr;//对/


对于二维数组:

int arr[3][2];
*arr;//这里跟上面一样,转换成首元素指针,于是*arr表示int [2]数组.

试试:sizeof(*arr) == 8;
int (*)[2] = &*arr ;

**arr;//之所以可以这么写是因为上面转换成来的 int [2];数组还可以再次转换成首元素指针.再次被解引用,实际上这样更直观 *(*arr);

数组名绝不不是就是指针.二维数组名更不是就是二维指针,详见我上面的链接....

------解决方案--------------------
仅供参考
C/C++ code
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
    p=(int **)malloc(4*sizeof(int *));
    if (NULL==p) return;
    for (i=0;i<4;i++) {
        p[i]=(int *)malloc(5*sizeof(int));
        if (NULL==p[i]) return;
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            p[i][j]=i*5+j;
        }
    }
    for (i=0;i<4;i++) {
        for (j=0;j<5;j++) {
            printf(" %2d",p[i][j]);
        }
        printf("\n");
    }
    for (i=0;i<4;i++) {
        free(p[i]);
    }
    free(p);
}
//  0  1  2  3  4
//  5  6  7  8  9
// 10 11 12 13 14
// 15 16 17 18 19

------解决方案--------------------
探讨
引用:
第二问
const int* &amp;amp;rp = a;// 这句话会提示两边的数据类型不匹配

换成:

int*const &amp;amp;rp = a;


兄弟 我感觉const int* &amp;amp和int*const &amp;amp是一样的啊 把int*看成一个整体 就先看成int吧 那么上面的两种引……