C++中方括号[]的作用总结
今天在编程的时候,遇到这样一条语句”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++中方括号[]的作用总结相关推荐
- shell中各种括号的作用详解()、(())、[]、[[]]、{}(推荐)
一.小括号,圆括号() 1.单小括号 () ①命令组.括号中的命令将会新开一个子shell顺序执行,所以括号中的变量不能够被脚本余下的部分使用.括号中多个命令之间用分号隔开,最后一个命令可以没有分号, ...
- java中的括号表示什么_Java中大括号的作用是什么?
优质回答 回答者:坛小帅 大括号的作用是将其包裹的代码视为一个整体. 如,类名后的大括号,就表示里面的代码组成这个类.方法名后的大括号,表示里面的代码组成了这个方法.for循环,while循环,if判 ...
- 命令行说明中方括号、尖括号的含义
命令行说明中方括号.尖括号的含义 命令行语法中,某些字符与格式有着特殊的含义,下面主要针对[].<>.|.-等符号进行说明: 一.方括号[ ] 方括号([ ])表示里面的元素(参数.值或信 ...
- 正则表达式专题(JS版)之4、正则表达式括号的作用
不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...
- mysql中括号的作用_括号()的作用
括号()的作用,先执行括号里面的命令,提高优先级 括号里面有"与"和"或"时,"与"优先. and 与 (2者都要满足) or 或 (满足其 ...
- 第三章 正则表达式括号的作用
不管哪门语言中都有括号.正则表达式也是一门语言,而括号的存在使这门语言更为强大. 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准. 括号的作用,其实三言两语就能说明白,括号提供了分组, ...
- c语言中 小括号的作用,c语言小括号的用法有哪些用处
C语言的小括号里面表示一条语句,返回值是多条语句中最靠右的语句的返回值,下面学习啦小编就为大家介绍c语言小括号的用法,欢迎大家阅读. c语言小括号的用法:单小括号 () ①命令组.括号中的命令将会新开 ...
- 正则表达式 (正则表达式括号的作用)
正则表达式之前学习的时候,因为很久没怎么用,或者用的时候直接找网上现成的,所以都基本忘的差不多了.所以这篇文章即是笔记,也让自己再重新学习一遍正则表达式. 其实平时在操作一些字符串的时候,用正 ...
- while循环体花括号的作用
while循环体花括号的作用 while的循环体不一定要用花括号括起来.用花括号括起来是为了让编译器知道while循环的循环体范围. 1.如果没有花括号,编译器就会认为while的循环体只有紧接着wh ...
最新文章
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.
- ux和ui_我怎么知道UI / UX是否适合我?
- 【GIS风暴】GeoJSON数据格式案例全解
- 2021 年前端趋势预测
- DB2 CASE/IF 条件控制语句
- Oracle sqlserver mysql的自增变量设置
- @Configuration使用
- ahjesus sql2005+游标示例
- PHP cookie和session的分析
- 漫步微积分三十七——力和功
- Flex Builder 3.0正式版+破解补丁
- 如何在手机端抓https的报文
- 关于solidworks+workbench的参数化建模分析的一点心得1
- 从智慧零售,看腾讯的数字化转型之道
- 微信企业号开发:企业支付基础
- 学习日志之synthesis and optimization(4)——banding and sharing
- ascii art c语言,ASCII art (简体中文)
- XLSX实现导出带样式的Excel表格的坑
- Outlook分组后,为什么桌面和收件箱无提示
- 误删桌面文件如何恢复?
热门文章
- puppy linux ssh,Blogs | 中文Puppy Linux开发者之家
- updog:一款局域网传输文件的软件
- [SSPU新生赛2019]Coda的题解集
- HTML表格(二)---成绩单
- Android Studio《一行代码》3.3.4 百分比布局
- java eclipse 查看版本_怎么查看eclipse的版本号
- Keras【极简】ACGAN
- intel clear linux 教程,英特尔ClearLinux安装教程
- java 输入一串字符串 字符串长度不超过100
- 【小5聊】TortoiseGit代码管理之hint: Updates were rejected because a pushed branch tip is behind its remote