今天在编程的时候,遇到这样一条语句”delete [] p;”,回想之前使用delete基本上都是采用的”delete p;”的方式,比较好奇这两种语句的区别。查找相关资料资料之后,决定进一步地把C++中最为常见的符号“[]”的作用进行总结。
  一般来说,“[]”的作用一共有三种:
  

1.

  声明变量时使用“[]”,表示数组。如下所示:
  int a[5];  //定义了一个大小为5的整型数组
  int a[]={1,2,3,4,5};  //定义一个整型数组并初始化
  int *p=new int[size];  //申请一个动态整型数组,数组长度由变量size决定
  int (*a)[10];  //定义一个数组指针,注意:*a表明a是指针类型,而[10]则表明a指向的是一个大小为10的数组。
  int *a[10];  //这一条与上一条对比来看,同样表示了一个大小为10的数组,不过数组元素均是指向整型变量的指针,故称为指针数组。
  

2.

  表示下标运算。如下所示:
  int *p;
  p[1]=2;
  上面的语句不难理解:定义了一个指向整型变量的指针p,由于指针变量中保存着地址,通过“地址+[]”的运算即可给下一地址赋值2.
  关于指针与地址再多写一些。记得刚学c语言的时候,为这两者之间的关系困惑了很久。后来我们老师是这样解释的:你可以创建一个整型变量a来存储整型数,同样也可以创建指针(变量)来存储相应数据地址。你可以使用整型变量a进行各种运算,如(a+2)*3,同样地,指针也可以“代表”数据地址进行各种处理,譬如上面的p[1]=2.
  STL中的一些模板,也重载了[]运算符,如vector和map。
  

3.

  指示指针。这种用法一般是在数组作为函数参数时会用到。如下所示:
  void fun(int a[]);  //[]说明a是一个指针变量
  void fun(int a[][10]);   //前一个“[]”说明a是指针类型,后一个“[]”则说明指针数组的大小为10.这里的“数组”指的是由二维数组行向量构成的一维数组。这种书写方式一般是在二维数组作为函数参数调用时会用到,此处的10即代表的是数组第二维的大小。需要注意的是,第二维的大小必须明确。
  void fun(int (*a)[10]);  //这种写法和上面是等价的。同样,必须规定第二维的大小。第一维的大小则不受限制,甚至会被编译器“忽略”。例如,你定义了一个函数void func(int a[3][10]),如果此时实参是b[5][10],也可以通过编译,即使它的第一维长度5超过了形参的一维长度3;而如果实参是b[3][8],则不会编译通过,因为它们的第二维长度不一致。 
  值得注意的是,void fun(int **p)与上式的含义是不一样的。这里的p表示的是指针的指针,是“二重”的指针,与int *a[10]中的a是一个意思;而void fun(int a[][10])中的a是二维数组的行向量构成的一维数组的指针,归根结底是“一重”的指针。

————————————————————我是分割线———————————————————
  回到最开始提到的问题:delete p与delete[] p到底有什么区别?查阅资料可知,这两种用法分别是operator delete函数的两个重载版本。
  通常来说,如果p指向的是单个对象的话,应当调用delete p,以释放内存;如果p指向的是一组对象的内存地址的话,则应当调用delete[] p,可以达到逐个调用每个对象的析构函数,再释放内存的效果。在第二种情况下,如果还是使用delete p语句,则除p[0]之外对象的内存没有得到释放,会造成内存泄漏。
  需要注意的是,如果p指向的一组对象都是像int/long/float一类的简单数据类型,由于它们没有析构函数,因此此时使用delete p与使用delete[] p的效果是一致的。  

C++中方括号[]的作用总结相关推荐

  1. shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)

    一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...

  2. java中的括号表示什么_Java中大括号的作用是什么?

    优质回答 回答者:坛小帅 大括号的作用是将其包裹的代码视为一个整体. 如,类名后的大括号,就表示里面的代码组成这个类.方法名后的大括号,表示里面的代码组成了这个方法.for循环,while循环,if判 ...

  3. 命令行说明中方括号、尖括号的含义

    命令行说明中方括号.尖括号的含义 命令行语法中,某些字符与格式有着特殊的含义,下面主要针对[].<>.|.-等符号进行说明: 一.方括号[ ] 方括号([ ])表示里面的元素(参数.值或信 ...

  4. 正则表达式专题(JS版)之4、正则表达式括号的作用

    不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...

  5. mysql中括号的作用_括号()的作用

    括号()的作用,先执行括号里面的命令,提高优先级 括号里面有"与"和"或"时,"与"优先. and 与 (2者都要满足) or 或 (满足其 ...

  6. 第三章 正则表达式括号的作用

    不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...

  7. c语言中 小括号的作用,c语言小括号的用法有哪些用处

    C语言的小括号里面表示一条语句,返回值是多条语句中最靠右的语句的返回值,下面学习啦小编就为大家介绍c语言小括号的用法,欢迎大家阅读. c语言小括号的用法:单小括号 () ①命令组.括号中的命令将会新开 ...

  8. 正则表达式 (正则表达式括号的作用)

    正则表达式之前学习的时候,因为很久没怎么用,或者用的时候直接找网上现成的,所以都基本忘的差不多了.所以这篇文章即是笔记,也让自己再重新学习一遍正则表达式.     其实平时在操作一些字符串的时候,用正 ...

  9. while循环体花括号的作用

    while循环体花括号的作用 while的循环体不一定要用花括号括起来.用花括号括起来是为了让编译器知道while循环的循环体范围. 1.如果没有花括号,编译器就会认为while的循环体只有紧接着wh ...

最新文章

  1. 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
  2. ux和ui_我怎么知道UI / UX是否适合我?
  3. 【GIS风暴】GeoJSON数据格式案例全解
  4. 2021 年前端趋势预测
  5. DB2 CASE/IF 条件控制语句
  6. Oracle sqlserver mysql的自增变量设置
  7. @Configuration使用
  8. ahjesus sql2005+游标示例
  9. PHP cookie和session的分析
  10. 漫步微积分三十七——力和功
  11. Flex Builder 3.0正式版+破解补丁
  12. 如何在手机端抓https的报文
  13. 关于solidworks+workbench的参数化建模分析的一点心得1
  14. 从智慧零售,看腾讯的数字化转型之道
  15. 微信企业号开发:企业支付基础
  16. 学习日志之synthesis and optimization(4)——banding and sharing
  17. ascii art c语言,ASCII art (简体中文)
  18. XLSX实现导出带样式的Excel表格的坑
  19. Outlook分组后,为什么桌面和收件箱无提示
  20. 误删桌面文件如何恢复?

热门文章

  1. puppy linux ssh,Blogs | 中文Puppy Linux开发者之家
  2. updog:一款局域网传输文件的软件
  3. [SSPU新生赛2019]Coda的题解集
  4. HTML表格(二)---成绩单
  5. Android Studio《一行代码》3.3.4 百分比布局
  6. java eclipse 查看版本_怎么查看eclipse的版本号
  7. Keras【极简】ACGAN
  8. intel clear linux 教程,英特尔ClearLinux安装教程
  9. java 输入一串字符串 字符串长度不超过100
  10. 【小5聊】TortoiseGit代码管理之hint: Updates were rejected because a pushed branch tip is behind its remote