浅谈C/C++数组取地址
2017-10-23 17:58
323 查看
我们先来看以下一段代码:
我定义了一个长度为6的int型数组(注意,如果你要亲自试一试,不要用char型,因为char型数组会被当作字符串处理,这可能会给你带来新的困惑,这个我们以后再谈。),数组的第六个元素是一个终止符。
cout<<array<<endl; 默认会输出数组array的首地址,即第一个元素的地址。
cout<<&array<<endl; &是取地址符,这里取的也是第一个元素的地址。
我们可以看到结果如下:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428182633533-1992571210.jpg)
结果确实是相等的。
我们再来看下面的代码:
我们可以通过给出数组下标来查找特定元素的地址,比如&array[0],就是取数组第一个元素的地址,&array[1]取的就是第二个元素的地址。我们知道,一个int型元素占4个字节,所以第一个元素和第二个元素的地址应该相差4,我们看看运行结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428183131205-221445733.jpg)
前两行都是第一个元素的地址,第三行是第二个元素的地址,二者的确相差4个字节。
我们接着看下面的代码:
这里的&array[0]+1,意思是取第一个元素的地址,然后加上一个int型的长度,也就是加4个字节,而不是真的加1。加4个字节后其实就等价于取第二个元素的地址,我们来看看运行结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428183735439-477156129.jpg)
前两个结果是一样的,对应第二个元素的地址。第三行是&array[0]的结果,可以看到&array[0]+1比&array[0]大了4,而不是1,这点一定要注意。
最后我们来看:
前面我们提到过,&array和&array[0]取的都是第一个元素的地址,而&array[0]+1取的是第二个元素的地址,+1加的其实是4个字节。但这里的&array+1可不再是加4个字节了,加的是整个数组的长度。+1的尺度和+1前面的操作数息息相关,array指代的是整个array数组,而array[0]指代的只是一个元素,所以二者+1时增加的字节是完全不一样的,这点希望大家能有所体会。由于array是一个长度为6的int型数组,所以+1加的应该是6*4=24个字节,我们来看结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428184815158-2010371454.jpg)
可以看到二者相差18,18是十六进制表示,转化成十进制就是24。
1 #include<iostream> 2 using namespace std; 3 int main(){ 4 int array[6] = { 1,2,3,4,5,'\0'}; 5 cout<<array<<endl; 6 cout<<&array<<endl; 7 return 0; 8 }
我定义了一个长度为6的int型数组(注意,如果你要亲自试一试,不要用char型,因为char型数组会被当作字符串处理,这可能会给你带来新的困惑,这个我们以后再谈。),数组的第六个元素是一个终止符。
cout<<array<<endl; 默认会输出数组array的首地址,即第一个元素的地址。
cout<<&array<<endl; &是取地址符,这里取的也是第一个元素的地址。
我们可以看到结果如下:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428182633533-1992571210.jpg)
结果确实是相等的。
我们再来看下面的代码:
#include<iostream> using namespace std; int main(){ int array[6] = { 1,2,3,4,5,'\0'}; cout<<&array<<endl; cout<<&array[0]<<endl; cout<<&array[1]<<endl; return 0; }
我们可以通过给出数组下标来查找特定元素的地址,比如&array[0],就是取数组第一个元素的地址,&array[1]取的就是第二个元素的地址。我们知道,一个int型元素占4个字节,所以第一个元素和第二个元素的地址应该相差4,我们看看运行结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428183131205-221445733.jpg)
前两行都是第一个元素的地址,第三行是第二个元素的地址,二者的确相差4个字节。
我们接着看下面的代码:
#include<iostream> using namespace std; int main(){ int array[6] = { 1,2,3,4,5,'\0'}; cout<<&array[1]<<endl; cout<<&array[0]+1<<endl; cout<<&array[0]<<endl; return 0; }
这里的&array[0]+1,意思是取第一个元素的地址,然后加上一个int型的长度,也就是加4个字节,而不是真的加1。加4个字节后其实就等价于取第二个元素的地址,我们来看看运行结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428183735439-477156129.jpg)
前两个结果是一样的,对应第二个元素的地址。第三行是&array[0]的结果,可以看到&array[0]+1比&array[0]大了4,而不是1,这点一定要注意。
最后我们来看:
#include<iostream> using namespace std; int main(){ int array[6] = { 1,2,3,4,5,'\0'}; cout<<&array<<endl; cout<<&array+1<<endl; return 0; }
前面我们提到过,&array和&array[0]取的都是第一个元素的地址,而&array[0]+1取的是第二个元素的地址,+1加的其实是4个字节。但这里的&array+1可不再是加4个字节了,加的是整个数组的长度。+1的尺度和+1前面的操作数息息相关,array指代的是整个array数组,而array[0]指代的只是一个元素,所以二者+1时增加的字节是完全不一样的,这点希望大家能有所体会。由于array是一个长度为6的int型数组,所以+1加的应该是6*4=24个字节,我们来看结果:
![](http://images2015.cnblogs.com/blog/933805/201604/933805-20160428184815158-2010371454.jpg)
可以看到二者相差18,18是十六进制表示,转化成十进制就是24。
相关文章推荐
- C++开发面试题:取地址符数组名与数组名
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- C/C++拾遗:关于数组的指针和数组元素首地址的一道经典题
- 浅谈C/C++中的指针和数组(二)
- C/C++ 关于数组的指针和数组元素首地址的一道经典题
- C++ 地址连续的多维数组实现
- 彻底搞清C/C++中一维数组,二维数组,指针,数组指针和指针数组以及指向指针的指针,行地址和列地址之间的关系
- [C++程序设计]用指针变量作函数参数接收数组地址
- C/C++ 数组与地址的关系
- 浅谈C语言中变量、常量、数组、字符串、指针的地址
- 浅谈C++内存分配及变长数组的动态分配
- 浅谈C++字符数组与字符串指针
- C/C++中关于地址、指针和引用变量的学习笔记(二) : 数组
- [C++程序设计]多维数组元素的地址
- 浅谈C/C++中的指针和数组(一)
- 浅谈C/C++中的指针和数组(一)
- 转:浅谈C/C++中的指针和数组(一)
- C++ 浅谈指针的用法:与const、一维数组、二维数组、typedef等结合
- C++拾遗之对数组名取地址
- c/c++对数组取地址