数组那些不为菜鸟所知的秘密(two)
来源:互联网 发布:阿里云 云市场 编辑:程序博客网 时间:2024/05/01 08:50
#include<iostream>using namespace std;int main1(){int a[3][2] = { (0, 1), (2, 3), (4, 5) };int *p;p = a[0];//a[0]相当于a[2]这个数组的数组名int(*p1)[2];p1 = a;//p1指向整个数组;cout << p[0] << endl;//1这里是逗号表达式的坑!!//相当于int a[3][2]={1,3,5};system("pause");return 0;}
&p[4][2]-&a[4][2]的值是多少?
int main(){int a[5][5];int(*p)[4];p = (int(*)[4])a;cout << &a[4][2] << endl;//00EEFB5Ccout << &p[4][2] << endl; //00EEFB4Ccout << &p[4][2] - &a[4][2] << endl;//-4system("pause");return 0;}
经过测试,可知&p[4][2]-&a[4][2]的值为-4。这到底是为什么呢?下面我们就来分析一下:
前面我们讲过,当数组名a作为右值时,代表的是数组首元素的首地址。这里的a为二维数组,我们把数组a看作是包含5个int类型元素的一维数组,里面再存储了一个一维数组。如此,则a在这里代表的是a[0]的首地址。a+1表示的是一维数组a的第二个元素。a[4]表示的是一维数组a的第5个元素,而这个元素里又存了一个一维数组。所以&a[4][2]表示的是&a[0][0]+4*5*sizeof(int)+2*sizeof(int)。
根据定义,p是指向一个包含4个元素的数组的指针。也就是说p+1表示的是指针p向后移动了一个“包含4个int类型元素的数组”。这里1的单位是p所指向的空间,即
4*sizeof(int)。所以,p[4]相对于p[0]来说是向后移动了4个“包含4个int类型元素的数组”,即&p[4]表示的是&p[0]+4*4*sizeof(int)。由于p被初始化为&a[0],那么&p[4][2]表示的是
&a[0][0]+4*4*sizeof(int)+2*sizeof(int)。
再由上面的讲述,&p[4][2]和&a[4][2]的值相差4个int类型的元素。现在,上面测试出来的结果也可以理解了吧?其实我们最简单的办法就是画内存布局图:
这里最重要的一点就是明白数组指针p所指向的内存到底是什么。解决这类问题的最
好办法就是画内存布局图。
0 1
- 数组那些不为菜鸟所知的秘密(two)
- 数组那些不为菜鸟所知的秘密(一)
- 数组那些不为菜鸟所知的秘密(零)
- 结构体那些不为菜鸟所知的秘密--位域
- C语言基础课程 第二课 HelloWorld不为菜鸟所知的秘密
- 不为以前所知的LNK2019问题
- 爱因斯坦不为人所知的十大秘密
- 盘点那些牛逼却不为人所知的软件
- 【转帖】揭露不为人所知的招聘网站的秘密, 业内人士告诉你:为何你的简历石沉大海?!
- 那些你不知道的单词小秘密
- C语言的那些小秘密之动态数组
- C语言的那些小秘密之动态数组
- C语言的那些小秘密之动态数组
- C语言的那些小秘密——动态数组
- C语言的那些小秘密之【动态数组】
- C语言的那些小秘密之动态数组 .
- C语言的那些小秘密之动态数组
- Windows下几个不为你所知的选择、复制和粘贴快捷键(insert、home、end)
- MySQL基本操作:数据库的创建、查询、更新、插入、删除表格
- Hibernate入门学习笔记
- Linux makefile 教程 --- 跟我一起写 Makefile
- 回到CSDN
- 关于C++和Java的引用和指针的问题
- 数组那些不为菜鸟所知的秘密(two)
- hdu 3460 Ancient Printer(trie tree)
- 闭包题目
- leetcode445 Add Two Numbers II java
- ORA-00119: invalid specification for system parameter REMOTE_LISTENER
- 懂二进制
- IT行业分析(华为裁员)
- 如何准备BAT技术面试答案(上)——Java研发方向
- Java中出现No enclosing instance of type XXX is accessible问题