二维数组与二维指针(测试环境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++编译则会不成功出现报错(类型不能转换):
对于二维数组的访问有以下的形式。但是每一种的含义都不同:
> 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
- 二维数组与二维指针(测试环境VS2015)
- 二维指针与二维数组
- 二维数组与二维指针
- 二维数组与二维指针
- 二维数组与指针
- 二维数组与指针
- 二维数组与指针
- 指针与二维数组
- 指针与二维数组
- 二维数组与指针
- 二维数组与指针
- 指针与二维数组
- 二维数组与指针
- 二维数组与指针
- 指针与二维数组
- 二维数组与指针
- 二维数组与指针
- 二维数组与指针
- 界面升级: 全新的Dungeons & Dragons 在线商店
- Deep Learning及NLP(自然语言处理)杂谈--第三部分
- lftp连接异常情况分析过程
- linux下c程序的编辑编译运行调试
- [UVA 11865]Stream My Contest[最小树形图][二分答案]
- 二维数组与二维指针(测试环境VS2015)
- 文本自动分类
- 2015_10_27
- 最完整的ftp命令大全
- AJAX实例
- 【经典DP】HDOJ 搬寝室 1421
- java中的转换流,OutputStreamWriter类与InputStreamReader
- 正则表达式
- android适配器