C++中关于[]静态数组和new分配的动态数组的区别分析

这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

这篇文章主要介绍了C++中关于[]静态数组和new分配的动态数组的区别分析,很重要的概念,需要的朋友可以参考下

本文以实例分析了C++语言中关于[]静态数组和new分配的动态数组的区别,可以帮助大家加深对C++语言数组的理解。具体区别如下:

一、对静态数组名进行sizeof运算时,结果是整个数组占用空间的大小;
因此可以用sizeof(数组名)/sizeof(*数组名)来获取数组的长度。
int a[5]; 则sizeof(a)=20,sizeof(*a)=4.因为整个数组共占20字节,首个元素(int型)占4字节。
int *a=new int[4];则sizeof(a)=sizeof(*a)=4,因为地址位数为4字节,int型也占4字节。

二、静态数组作为函数参数时,在函数内对数组名进行sizeof运算,结果为4,因为此时数组名代表的指针即一个地址,占用4个字节的内存(因为在传递数组名的参数时,编译器对数组的长度不做检查,具体可参考前面一篇c++对数组的引用实例分析)。对动态数组的函数名,无论何时进行sizeof运算,得到的结果都是4.

三、new还需要你delete,是在堆分配空间,效率较低;而[]直接在栈上分配,会自动释放,效率高,但是栈空间有限。

四、通过函数返回一个数组的问题

函数声明的静态数组不可能通过函数返回,因为生存期的问题,函数调用完其内部变量占用的内存就被释放了。如果想通过函数返回一个数组,可以在函数中用new动态创建该数组,然后返回其首地址。
其原因可以这样理解,因为[]静态数组是在栈中申请的,而函数中的局部变量也是在栈中的,而new动态数组是在堆中的分配的,所以函数返回后,栈中的东西被自动释放,而堆中的东西如果没有delete不会自动释放。

例子如下:

int *test(int *b) //b可以是静态数组的数组名,也可以是动态数组的首地址
{
  for(int i=0;i<5;i++) //输出传入的数组各元素
   cout<<*(b+i)<<" ";
  cout<<endl;
  int *c=new int[5]; //动态创建一个数组
  //如果将绿色部分换为int c[5];则主函数中调用test无法得到c数组
  for(i=0;i<5;i++)  //新数组的各项值等于传入的数组各项值加5
   *(c+i)=*(b+i)+5;
  return c;     //返回新创建的动态数组的首地址
}
int main()
{
 int *b=new int[5]; //创建动态数组b
 for(int i=0;i<5;i++)//赋值
  *(b+i)=i; 
 //绿色部分也可以换为int b[5]={0,1,2,3,4};即也可以是静态数组
 int *c=test(b);   //将b作为参数,调用test函数,返回值赋给c
 for(i=0;i<5;i++)  //输出test返回的数组的各项
   cout<<*(c+i)<<" ";
 cout<<endl;
 return 0;
}/* 何问起 hovertree.com */

相信看过本文实例分析之后可以进一步加深读者对C++数组的认识。

推荐:

http://www.cnblogs.com/roucheng/p/cppjy.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120321.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Vue刷新页面的三种方式[通俗易懂]

    Vue刷新页面的三种方式[通俗易懂]我们在写项目的时候,经常会遇到,用户执行完某个动作,改变了某些状态,需要重新刷新页面,以此来重新渲染页面。如:用户登录成功、增加、删除、更新等。原始方法:location.reload();vue自带的路由跳转:this.$router.go(0);用过的人都知道,前两者都是强制刷新页面,会出现短暂的闪烁,用户体验效果不好。所以,我们选择第三种方式:3.首先在App里面…

    2022年10月17日
    0
  • 完全背包问题_cf超级背包减伤和ac叠加吗

    完全背包问题_cf超级背包减伤和ac叠加吗有 N 个物品和一个容量是 V 的背包。物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。如下图所示:如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品个数和背包容量。接下来有 N

    2022年8月8日
    2
  • django自定义用户认证_编写一个自定义异常类

    django自定义用户认证_编写一个自定义异常类前言如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的源码分析源码的入口在APIView.py文件下的di

    2022年7月31日
    3
  • matlab中find函数用法[通俗易懂]

    matlab中find函数用法[通俗易懂]1.返回素有非零元素的位置例如:注:竖着数!!2.条件:find(A==1)例如:返回的仍然是位置!3.返回前N个非零元素的位置,find(A,X)例如:4.返回最后一个非零值的位置find(A,1,‘last’)例如:5.返回最后一个非零值的行列位置或者A中非零元素位置例如:6.[a,b,v]=find(A),找出A中非零元素所在的行和列,分别存储在a和b中,…

    2022年7月17日
    9
  • PEST分析顺丰服务需求_快递行业宏观环境PEST分析[通俗易懂]

    PEST分析顺丰服务需求_快递行业宏观环境PEST分析[通俗易懂]精品welcome宏观环境PEST分析PEST分析又称大环境分析,是研究宏观环境的有效工具。通过Pest分析法,公司能够剖析出自身所处的外部大环境究竟对自己的发展是有利还是有害,以及据此作出战略规划,趋利避害。其中每一个字母各代表一个因素,分别为:P(political—政治)、E(economic—经济)、S(social—社会)、T(technological—技术),接下来将通过pest分析…

    2022年6月11日
    42
  • Python安装第三方库(离线+在线)「建议收藏」

    Python安装第三方库(离线+在线)「建议收藏」一、离线安装以安装resquest包为例1、检查依赖模块的依赖包检查:在CMD命令窗口中输入pipshowrequests如图所示,依赖的包包括certifi,idna,urllib3,chardet可以在https://www.lfd.uci.edu/~gohlke/pythonlibs/网站下载对应的安装程序(Ctrl+F可以在页面查找所需安装包)certifi-2019.9.11-py2.py3-none-any.whlchardet-3.0.4-py2.py3-none-an

    2022年8月27日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号