当前位置: 首页 > 编程笔记 >

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

宋志学
2023-03-14
本文向大家介绍C++中关于[]静态数组和new分配的动态数组的区别分析,包括了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;
}

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

 类似资料:
  • 问题内容: 给定跟随类层次结构,以下语句的动态和静态类型是什么? 类层次结构: 对于以下每个语句,静态类型?动态类型?: 我 知道我的答案/问题将是静态和动态类型的Fruit。 在编译时将为Alpha类型(静态),在运行时将为Fruit类型(动态)。 在编译时将为Gamma类型(静态),在运行时将为Fruit类型(动态)。 但是我不知道其他两个答案。Beta b = f是一个实例,其中同一超类的两

  • 我应该对两个分区问题的动态规划实现应用什么修改来解决以下任务: 给你一个正整数数组作为输入,表示为C。程序应该决定是否可以将数组划分为两个相等的子序列。您可以从数组中删除一些元素,但不是全部,以使此类分区可行。 例: 假设输入是4 5 11 17 9。如果我们去掉11和17,两个分区是可能的。我问题是,我应该对我的两个分区实现进行什么调整,以确定两个分区是否可能(可能需要或可能不需要删除某些元素)

  • 为什么不能以这种方式获得分配的缓冲区长度。 释放同一数组时 运行时必须知道要解除分配多少。在删除数组之前,是否有任何访问长度的方法。如果没有,为什么没有提供获取长度的API?

  • 问题内容: 当您知道on上对象/项目的确切数量时,我非常想知道哪种内存分配方法对性能(例如,运行时间)有利,这对性能有好处。少量对象(少量内存)和大量对象(大量内存)的成本。 与 请告诉我。谢谢。 注意:我们可以对此进行基准测试,并且可能知道答案。但是我想知道解释这两种分配方法之间性能差异的概念。 问题答案: 静态分配将更快。静态分配可以在全局范围和堆栈上进行。 在全局范围内,静态分配的内存内置在

  • 当您知道中对象/项的确切数量时,我很想知道内存分配的首选方法是什么对性能(例如,运行时间)有好处Linux。少量对象(少量内存)和大量对象(大量内存)的成本。 例如,类型A【N】vs 请让我知道。非常感谢。 注意:我们可以对此进行基准测试,并可能知道答案。但我想知道解释这两种分配方法之间性能差异的概念。

  • 本文向大家介绍C++动态内存分配(new/new[]和delete/delete[])详解,包括了C++动态内存分配(new/new[]和delete/delete[])详解的使用技巧和注意事项,需要的朋友参考一下 C++动态内存分配(new/new[]和delete/delete[])详解 为了解决这个普通的编程问题,在运行时能创建和销毁对象是基本的要求。当然,C已提供了动态内存分配函数mall