C++的array和&array有什么区别

如果在C++中定义了一个数组,例如“ int array[5] ”,那么“ array ”或“ &array ”是什么意思?它们是相同的还是不同的?让我们一探究竟!

要检查这一点,首先可以想到的是以下程序:

#include <iostream>
using namespace std;
int main()
{
   int array[5];
   cout<<"array= "<<array<<" ,&array= "<<&array<<endl;
   return 0;
}

“ array ”和“ &array ”输出的地址是相同。虽然地址的内容相同,但它们是不同类型的地址。这才是“ array ”和“ &array ”真正的区别。

为了显示这种差异,修改一下上面的程序:

#include <iostream>
using namespace std;

int main()
{

    int array[5];
    cout<<"array= "<<array<<" ,&array= "<<&array<<endl;
    cout<<"array+1= "<<array+1<<endl;
    cout<<"&array+1= "<<&array+1<<endl;

    return 0;
}

运行结果:

将整数添加到指针时会指向该指针类型的下一个地址。从输出结果可以看出:

  • array+1输出的结果中地址值相较于array增加了4个字节。
  • &array+1输出的结果中地址值相较于&array增加了20个字节(0x14 bytes)。

通过这个结果可以推断出:

“ array ”是“指向 array 的第一个元素的指针”,而“ &array ”是“指向 拥有5 个 int 元素的整个数组的指针”。

这个逻辑也可以扩展到多维数组。假设 twoDarray[5][4] 是一个二维数组。这里,“twoDarray”是一个指向拥有4个int型元素数组的指针,而“&twoDarray”是指向拥有5个元素,每个元素是拥有4个int型元素的数组的,数组的指针”。可以使用程序打印测试。

所以结论是:任何数组名称本身都是指向数组第一个元素的指针,它更像是&array[0]。 但数组名称的 &(即地址)是指向整个数组本身的指针。

在使用其它的指针变量通过赋值符号保存地址值时。数组名称既然代表的是第一个元素,那么声明指针变量时就是:元素类型* 指针名称;而对于&数组名称,就需要声明一个指向数组的指针保存&array的值,要注意书写方式,指向数组的指针的书写方式与指向函数的指针有些类似。

int* p1 = array;
int* p2 = &array[0];
int    (*p3)[5] = &array;

如果感觉指向数组的指针书写形式过于复杂,也可以直接使用auto推断类型:

int* p1 = array;
int* p2 = &array[0];
int    (*p3)[5] = &array;
auto p4 = &array;

本文部分内容参自:What’s difference between “array” and “&array” for “int array[5]” ?

到此这篇关于C++的array和&array有什么区别的文章就介绍到这了,更多相关C++ array和&array内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解C++语言中std::array的神奇用法

    概述 std::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程序员不习惯,觉得std::array不好用.但实际上,std::array的威力

  • C++之boost::array的用法

    本文实例讲述了C++之boost::array的用法,分享给大家供大家参考.具体如下: 复制代码 代码如下: #include <string>  #include <iostream>  #include <boost/array.hpp>  #include <algorithm>  using namespace std;  int main()  {      boost::array<int, 5> array_temp = {{12,

  • C++之Boost::array用法简介

    本文实例讲述了c++里支持静态数组的容器:boost.array.分享给大家供大家参考.具体分析如下: 很多C++程序员都认为boost.array很有可能出现在下一代标准库里.对于boost.array的用法有一个基本的了解是很有必要的. 1. 为什么我们需要固定大小的数组的容器 首先,固定大小的数组还是很常见的,虽然stl提供了vector,但是vector作为动态可增长的数组,比静态数组多了一点开销,这在一些人看来是无法忍受的.c++里也需要提供固定大小容量的数组容器,当然,性能可以和普通

  • C++ STL array容器访问元素的几种方式

    当 array 容器创建完成之后,最常做的操作就是获取其中的元素,甚至有时还会通过循环结构获取多个元素.本节就对获取容器中元素的方法做个汇总. 访问array容器中单个元素 首先,可以通过容器名[]的方式直接访问和使用容器中的元素,这和 C++ 标准数组访问元素的方式相同,例如: values[4] = values[3] + 2.O*values[1]; 此行代码中,第 5 个元素的值被赋值为右边表达式的值.需要注意的是,使用如上这样方式,由于没有做任何边界检查,所以即便使用越界的索引值去访问

  • C++中rapidjson组装map和数组array的代码示例

    rapidjson组装map和数组array的代码示例 直接上码: #include <iostream> #include <map> // 请自己下载开源的rapidjson #include "rapidjson/prettywriter.h" #include "rapidjson/rapidjson.h" #include "rapidjson/document.h" #include "rapidjs

  • C++语言中std::array的用法小结(神器用法)

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程

  • 详谈js中数组(array)和对象(object)的区别

    •object 类型: ◦ 创建方式: /*new 操作符后面Object构造函数*/ var person = new Object(); person.name = "lpove"; person.age = 21; /*或者用对象字面量的方法*/ var person = { name: "lpove"; age : 21; } •array类型 ◦ 创建方式: `var colors = new Array("red","blu

  • 浅谈numpy中np.array()与np.asarray的区别以及.tolist

    array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会. 1.输入为列表时 a=[[1,2,3],[4,5,6],[7,8,9]] b=np.array(a) c=np.asarray(a) a[2]=1 print(a) print(b) print(c) 从中我们可以看出np.array与np.asarray功能是一样的,都是将输入转为矩阵格式.当输入是列表的时候,更改

  • C++的array和&array有什么区别

    如果在C++中定义了一个数组,例如“ int array[5] ”,那么“ array ”或“ &array ”是什么意思?它们是相同的还是不同的?让我们一探究竟! 要检查这一点,首先可以想到的是以下程序: #include <iostream> using namespace std; int main() { int array[5]; cout<<"array= "<<array<<" ,&array= &

  • JavaScript定义数组的三种方法(new Array(),new Array('x','y')

    如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Co

  • php数组相加 array(“a”)+array(“b”)结果还是array(“a”)

    在网上看到一道题: array("a")+array("b")的结果是___ A.array("a","b")B.array("b","a")C.array("b")D.array("a") 答案:D php两个数组相加,为什么结果还是不变呢? 因为,它们等效于array("0″=>"a")+array(&quo

  • javascript中new Array()和var arr=[]用法区别

    大家在学习javascript中对于数组函数new Array()和var arr=[]很多朋友不知道如何区别,也不知道用法,下面看看我们总结的. var arr=[] 这是一种字面量定义数组的方法 var arr=new Array() 这是调用数组构造函数生成的数组 上面的2种定义数组的方法到底一样不一样 目前我们大致的认同是下面这样的 用new 关键字去内存开辟一个存储地址比较耗资源,耗内存. 而字面量方式直接在内存开辟一个存储字段相对简单,不耗资源. 我们首先不去否定上面的结论对不对.

  • PHP中array_merge和array相加的区别分析

    首先来看看键名是string,两者区别: 复制代码 代码如下: <?php$arr1 = array('a'=>'PHP');$arr2 = array('a'=>'JAVA');//如果键名为字符,且键名相同,array_merge()后面数组元素值会覆盖前面数组元素值print_r(array_merge($arr1,$arr2)); //Array ( [a] => JAVA )//如果键名为字符,且键名相同,数组相加会将最先出现的值作为结果print_r($arr1+$ar

  • C# 中 Array和 ArrayList详解及区别

    C# 中 Array和 ArrayList详解及区别 一.Array 的用法 type[] typename=new type[size]; 或者 type[] typename=new type[]{ }; Array类型的变量在声明的同时必须进行实例化(如果初始化至少得初始化数组的大小) 平常我们int[],string[]...事实上就是声明一个array数组了 如: string [] srt=new string[]{"a","b"}; int[] a=n

  • 聊聊Numpy.array中[:]和[::]的区别在哪

    [:]和[::]的区别蛮大的,用的好可以节省时间,下面以实例进行分析 array([:]) >>> import numpy as np >>> >>> x=np.array([1,2,3,4,5,6,7,8,9,10,11,12]) >>> print(x[1:5])#打印index为1~5的数组,范围是左闭右开 [2 3 4 5] >>> print(x[3:])#打印index=3之后的数组,包含index=3

  • Scala中Array和List的区别说明

    目录 Scala Array和List的区别 Scala快排List和Array数组效率实测 Scala Array和List的区别 Difference between Array and List in scala Q:什么时候用Array(Buffer)和List(Buffer)? A:Scala中的List是不可变的递归数据(immutable recursive data),是Scala中的一种基础结构,你应该多用List而不是Array(Array实际上是mutable,不可变(im

随机推荐