二维数组与二维指针(测试环境VS2015)

来源:互联网 发布:overlay网络百度百科 编辑:程序博客网 时间:2024/05/18 02:22

二维数组与二维指针(测试环境VS2015)

定义一个二维指针指向二维数组应如下定义:

int num[4][5];int (*p)[5]=num;

而下面的这种定义在C的编译下是警告(可以成功),但在C++编译下会报错:

int num[4][5];int **p=num;

C中编译报警告如下(尽管成功,但是可以在C编译环境中看见会有警告,说间接级别不同):

尽管成功,但是可以在C编译环境中看见会有警告,说间接级别不同

而在C++编译则会不成功出现报错(类型不能转换):

类型不能转换

对于二维数组的访问有以下的形式。但是每一种的含义都不同:

> 1.    num[i][j];> 2.    * ( num[i]+j );> 3.    * ( *( num+i ) + j );

要理解以上三种形式(第一种就不讲了)就必须理解(&num)、(*num)、(num)所代表的地址含义:

&num:代表的是整个二维数组的起始地址,即num[0][0]的地址,但是此地址指向空间大小为此时num定义的大小为80个字节。

*num:同样代表的是num[0][0]的起始地址,但指向空间代表的大小会有不同,代表是每一行每一列对应的一个元素的大小,即4个字节。

num:也是代表num[0][0]的起始地址,但是这时候空间指向的大小是数组一行的大小,即num数组一行的大小为20字节。

这里 我们做个测试:

#include<stdio.h>#include<stdlib.h>void main(){    int num[4][5];    int(*p)[5] = num;    printf("\n  num[0][0]的地址为: %x", &num[0][0]);    printf("\n  &num的地址为: %x  &num所对应的大小为%d字节", &num, sizeof( *(&num) ));    printf("\n  *num的地址为: %x  *num所对应的大小为%d字节", *num, sizeof( **num ));    printf("\n  num的地址为: %x  num所对应的大小为%d字节", num, sizeof( *num ));    getchar();}

结果显示和上述一样:
这里写图片描述

所以可以得到结论:
*num+1会加上四个字节指向下一个元素,而num+1就会加上20字节指向下一行的元素,所以如:*num+1 即指向下一个元素的地址&num[0][1],所以取出对应的值通用表达式就为:

*( *(num+i)+j )

又因为 *(num+i) 可以写出 num[i],所以又可以写成 :

  * (num[i]+j)
0 0
原创粉丝点击