数组的奥秘——一维数组
2013-12-04 19:11
267 查看
在谈论C/C++的时候,就不可避免的会谈到数组和指针,很多时候我们会将这两者搞混。
在这里,我们会谈到一维数组,加深对其的理解。
对于下面这样一个定义:
int a[5];
定义了一个整形的数组,数组名为a,有5个元素。
那么 a ,&a ,&a[0] 这三者之间有什么区别呢?
我们先通过VS来测试一下
先看下他的运行结果:
我们可以看到,其实三个表达式的值都是一样的,那么他们的区别在哪里呢?
毫无疑问,对于三个表达式的值,我们肯定可以确定,这个值就是数组的地址。其中 &a[0] 代表数组首元素的地址,它的值和数组的地址是一样的。那么 a 和 &a 到底代表什么呢?
我们将表达式的值加 1 ,看看它的值是什么。
运行结果如下:
从这里我们可以看出一些区别来了。首先,&a 和 a , &a[0] 是不一样的,我们现在来分析他们的值:
对比 a 和 a+1 : a + 1 比 a 多了 0x4,也就刚好一个 int 型数据的大小,这个和 &a[0]+1 的结果是一样的。在这里我们应该可以推断, a 代表数组首元素的地址,其性质和 &a[0] 是一样的。我们通过以下代码来验证:
结果如下:
说明我们的推断是正确的。
我们再来分析 &a 和 &a + 1 :我们从它的结果来看,&a + 1 刚好在 &a 的基础上增加了 0x14,也就是十进制的20 字节。它刚刚好等于整个数组的大小,也就是说 &a + 1 其实是下一个数组的地址。这样我们就可以推断 &a 代表整个数组的地址。
其实这个我们可以通过VS内建的调试工具——来说明;我们在调试的时候设置断点,通过内存查看器来验证:
通过以上的分析,我们总结如下:
一维数组的分析就到这了,精彩还在后头哦。。。。
在这里,我们会谈到一维数组,加深对其的理解。
对于下面这样一个定义:
int a[5];
定义了一个整形的数组,数组名为a,有5个元素。
那么 a ,&a ,&a[0] 这三者之间有什么区别呢?
我们先通过VS来测试一下
#include<iostream> using namespace std; int main(){ int a[5] = { 1, 2, 3, 4, 5 }; cout << "a=" << a << endl; cout << "&a=" << &a << endl; cout << "&a[0]=" << &a[0] << endl; cout << endl; system("pause"); return 0; }
先看下他的运行结果:
我们可以看到,其实三个表达式的值都是一样的,那么他们的区别在哪里呢?
毫无疑问,对于三个表达式的值,我们肯定可以确定,这个值就是数组的地址。其中 &a[0] 代表数组首元素的地址,它的值和数组的地址是一样的。那么 a 和 &a 到底代表什么呢?
我们将表达式的值加 1 ,看看它的值是什么。
#include<iostream> using namespace std; int main(){ int a[5] = { 1, 2, 3, 4, 5 }; cout << "a=" << a << endl; cout << "a + 1=" << a + 1 << endl; cout << endl; cout << "&a=" << &a << endl; cout << "&a + 1=" << &a + 1 << endl; cout << endl; cout << "&a[0]=" << &a[0] << endl; cout << "&a[0] + 1=" << &a[0] + 1 << endl; cout << endl; system("pause"); return 0; }
运行结果如下:
从这里我们可以看出一些区别来了。首先,&a 和 a , &a[0] 是不一样的,我们现在来分析他们的值:
对比 a 和 a+1 : a + 1 比 a 多了 0x4,也就刚好一个 int 型数据的大小,这个和 &a[0]+1 的结果是一样的。在这里我们应该可以推断, a 代表数组首元素的地址,其性质和 &a[0] 是一样的。我们通过以下代码来验证:
#include<iostream> using namespace std; int main(){ int a[5] = { 1, 2, 3, 4, 5 }; cout << "采用 a+i 形式输出数组元素:" << endl; for (int i = 0; i < 5; i++){ cout << *(a + i) << "\t"; } cout << endl; cout << "采用 a[i] 下标形式输出数组元素:" << endl; for (int i = 0; i < 5; i++){ cout << a[i] << "\t"; } cout << endl; system("pause"); return 0; }
结果如下:
说明我们的推断是正确的。
我们再来分析 &a 和 &a + 1 :我们从它的结果来看,&a + 1 刚好在 &a 的基础上增加了 0x14,也就是十进制的20 字节。它刚刚好等于整个数组的大小,也就是说 &a + 1 其实是下一个数组的地址。这样我们就可以推断 &a 代表整个数组的地址。
其实这个我们可以通过VS内建的调试工具——来说明;我们在调试的时候设置断点,通过内存查看器来验证:
通过以上的分析,我们总结如下:
int a[5] = { 1, 2, 3, 4, 5 }; a;//代表数组的首元素地址 &a;//代表数组的首地址 &a[0];//代表数组首元素的地址 //三者的值虽然是一样的,但是含义确实不一样的
一维数组的分析就到这了,精彩还在后头哦。。。。
相关文章推荐
- 1011:软件版本
- 整除问题
- 第十五周 多科成绩单(人名版)
- Genesis-3D 入门教程—16.声音
- 如何对oracle数据库中的表设置主键自增?
- JAVA读取外部资源的方法
- SYBASE 及整理一些单引号与双引号问题:
- Eclipse中SVN的安装步骤(两种)和使用方法
- java动态代理机制
- Uva 11729 Commando War - 水题 - 贪心
- 迭代方法
- python 2.4 升级到2.6方法
- 12个小球问题
- Spring 3.0参考之SpEL
- 关于解决ubuntu误改sudoers文件的解决办法
- 查看进程的启动时间
- NT式驱动基本结构
- Html5介绍及视频教程
- erlang mnesia数据库设置主键自增
- C++初始化与赋值 区别