二维数组与指针

原贴地址:点击打开链接

   二位数组,数组指针,指针数组,指针的指针。这四者之间的关系希望大家看完这篇文章后在也不会分不清楚了。

在C/c++中,数组和指针有着密切的关系,有很多地方说数组就是指针式错误的一种说法。这两者是不同的数据结构。其实,在C/c++中没有所谓的二维数组,书面表达就是数组的数组。我猜想是为了表述方便才叫它二维数组。

以前认为二位数组是一个二级指针,现在发现理解错了,二维数组名也是个一级指针,指向一个类型并且长度为二位数组的列的一个指针。

下面我整理了它们之间的关系:

  int ** Ptr <==> int Ptr[ x ][ y ];
   int *Ptr[ 5 ] <==> int Ptr[ 5 ][ x ];
   int ( *Ptr )[ 5 ] <==> int Ptr[ x ][ 5 ];
   这里 x 和 y 是表示若干的意思。


“数组名被改写成一个指针参数”规则并不是递归定义的。数组的数组会被改写成“数组的指针”,而不是“指针的指针”:

实参                                                      所匹配的形参


数组的数组          char c[8][10];                  char (*)[10];          数组指针


指针数组             char *c[10];                    char **c;               指针的指针


数组指针(行指针)  char (*c)[10];                  char (*c)[10];        不改变


指针的指针           char **c;                        char **c;               不改变


下面我们举例说明:

int a[2][3]    二位数组   a指向了一个存储int类型并且长度为3的一个指针,相当于行指针,只是确定了这个行指针的长度

int (*a)[3]    数组指针,a指向了一个存储int类型并且长度为3的一个指针,相当于行指针

int  *a[3]    指针数组,a指向的存储单元是一个指针,这个指针的内容是一个int类别,a的长度为3

int **a       二级指针    a指向的存储单元是一个指针,这个指针的内容是一个int类别,a的长度不确定


在看下面一个例子:

#include
   
   
    
    
 
int main(int argc,int * argv[]) 
{ 
    int arr1[3]; 
    int arr2[3]; 
    int arr3[3]; 
    int * ptr; 
    // ptr1是一个指向 int [3] 的指针,即ptr的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    int ptr1[3][3]={{1,2,3},{1,2,3},{1,2,3}}; 
    // ptr2是一个指向 int * 的指针,即ptr2的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    int * ptr2[3]={arr1,arr2,arr3}; 
    // ptr3是一个指向 int [3] 的指针,即ptr3的类型和&arr1的类型是一样的,注意:arr1指向的内存区域定长 
    int(* ptr3)[3]=&arr1; 
    ptr3=ptr1; // 没错,他们的类型相同 
    // ptr3=ptr2;//error 无法从“int *[3]”转换为“int (*)[3] 
    // ptr4是一个指向 int * 的指针,即ptr4的类型和&ptr是一样的,注意:ptr指向的内存区域不定长 
    int ** ptr4; 
    //ptr4=&arr1; //error 无法从“int (*)[3]”转换为“int ** 
    ptr4=ptr2; // 没错,他们的类型相同 
    //ptr4=ptr3; // error 无法从“int (*)[3]”转换为“int ** 
    return 0; 
}
   
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值