浅谈C/C++数组取地址

本文讲的是关于C/C++数组取地址一些基本的概念,但是新手可能会在学习相关内容时产生一定的困惑,希望本文能帮助到你。

我们先来看以下一段代码:

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; &是取地址符,这里取的也是第一个元素的地址。

我们可以看到结果如下:

结果确实是相等的。



我们再来看下面的代码:

#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,我们看看运行结果:

前两行都是第一个元素的地址,第三行是第二个元素的地址,二者的确相差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个字节后其实就等价于取第二个元素的地址,我们来看看运行结果:

前两个结果是一样的,对应第二个元素的地址。第三行是&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个字节,我们来看结果:

可以看到二者相差18,18是十六进制表示,转化成十进制就是24。

希望通过本文,能让你对C/C++数组取地址的一些概念更加清楚。

注:文中可能有所纰漏,欢迎批评指正!也欢迎在本文下方评论交流!

时间: 2024-10-11 20:46:56

浅谈C/C++数组取地址的相关文章

浅谈集合---动态数组

集合---一个存储数据的"无底洞"\动态数组,集合的作用和数组一样可以存储多个数据.但是集合中能够存储的数据的个数是动态增长的.随着我们往集合中新增元素的增多而自动增大.那么为什么它的长度可以变化呢? 其实集合的本质就是数组,只不过当数组中存储的元素的个数等于数组长度的时候,就会自动new一个新数组,长度是原来的数组的两倍,在将原始的数据拷贝到新数组中,然后把旧数组的引用重新指向刚刚new的新数组,从而实现了动态增长! 浅谈集合---动态数组,布布扣,bubuko.com

浅谈网络中的IP地址

IP地址是现在生活中不可或缺的,互联网的运用,使我们的生活变得多元化,充满乐趣.想了解这一切,需要先从根本了解,今天浅谈以下IP地址,从以下几个方面介绍: 一.IP地址的作用:在一定范围,唯一的标示,一个上网的设备:(凡是需要上网的设备,必须得有IP地址) 二. IP地址如何表示: 1.让机器看的10101010100010101010 (纯2进制) 2.让人看的点分十进制,X.X.X.X (X表示的是一个10进制)每一个X对应的是8个二进制每一个X对应 1 个字节:X取值范围是 0 --255

C语言对数组取地址

#include <stdio.h> main() { int a[5] = {1,2,3,4,5}; printf("a=%p\n" , a); printf("a=%p\n" , &a); printf("a=%p\n" , &a+1); int *ptr = (int*)(&a+1); printf("%d %d\n" , *(a+1), *(ptr-1)); } 大家先看如上代码.然

ES6浅谈--const,数组解构

关于const: 1.const声明的基本类型的值不可重复声明,不可修改,声明之后需要初始化,声明存在暂时性死区,只在声明的块级作用域内有效. 2.const本质上确保的是变量的内存地址的数值不会被改动,所以对于基本类型的值来说,数值在栈中保存,不会被修改:但是对于对象来说,const声明的对象不可以被改变的是内存地址,数据存在堆中,是可以被修改的,如果想不被修改需要freeze. 3.冻结对象后不能新添加属性,但是还可以修改原有属性,所以需要彻底冻结所有属性. 4.浏览器环境下顶层对象和全局对

从爬取华科hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;

原创文章与源码,如果转载请注明来源. 开发环境:Myeclipse,依赖包:apache-httpclient . Jsoup.base64 一.概述 华科大的教务系统(hub系统)做的算是比较好的,无论是界面还是其安全性来说,都是很不错的.大家可以用浏览器的调试工具F12看一下里面的源码.关于它的安全性,在后面会为大家提到.而在布局方面,用<div>代替了一些传统网站使用的<iframe>,导航栏也是使用的比较流行的插件. 其首页地址为http://hub.hust.edu.cn

浅谈json和数组的区别

json和数组都是存储数据的,但是也是有一定区别的. 区别一:json的下标与数组的下标不一样,json的下标是字符串,数组的下标是数字. <script> window.onload=function(){ var json={name:'Juce',age:'23'}; alert(json.age);//又等于alert(json[age]) var arr=['a','b','c']; alert(arr[0]); } </script> 区别二:json没有长度,而数组有

浅谈树状数组套主席树

话说主席树还没写就先写这一篇了\(qwq\) 回顾一下主席树的实现过程:类似查分思想,将线段树的每次修改看做函数式以支持可持久化.因为这样的线段树是可减的. 那么我们维护信息的时候,就要维护每一次新形成的信息.但是我们可以根据前一个信息的基础上进行改动,而不必要去再建一棵树. 所以总而言之,是前缀和的思想. 那么,当需要修改的时候,怎么做呢? 考虑普通的区间操作,当做单点修改的时候,一般用树状数组,线段树和分块.最好实现的就是树状数组. 考虑用树状数组来维护主席树的信息. 树状数组中维护了每一次

浅谈树状数组

还是区间求和区间修改的问题,我们使用线段树解决以后发现编程复杂度比较大 在这里介绍一个简单的数据结构,树状数组. 树状数组的优势是编程复杂度小,常数小,时间复杂度也不错 树状数组的查询,修改,都是LOG(N)级别的 下面来分析一下上面那个图看能得出什么规律: 据图可知:c1=a1,c2=a1+a2,c3=a3,c4=a1+a2+a3+a4,c5=a5,c6=a5+a6,c7=a7,c8=a1+a2+a3+a4+a5+a6+a7+a8,c9=a9,c10=a9+a10,c11=a11.......

浅谈JS的数组遍历方法

用过Underscore的朋友都知道,它对数组(集合)的遍历有着非常完善的API可以调用的,_.each()就是其中一个.下面就是一个简单的例子: var arr = [1, 2, 3, 4, 5]; _.each(arr, function(el) { console.log(el); }); 上面的代码会依次输出1, 2, 3, 4, 5,是不是很有意思,遍历一个数组连for循环都不用自己写了._.each()方法遍历数组非常好用,但是它的内部实现一点都不难.下面就一起来看看到底是如何实现_