chdoca的个人博客分享 http://blog.sciencenet.cn/u/chdoca

博文

C++Primer学习笔记

已有 4070 次阅读 2012-5-7 18:20 |个人分类:学习心得|系统分类:科研笔记| 学习, style, face, center, exactly

第四章      数组和指针(5.7

 

 

本章介绍C++提供的两种类似于vector和迭代器类型的低级复合类型数组和指针。区别在于:数组的长度一经创建就不能改变。在C++程序中应尽量使用vector和迭代器类型,而避免使用低级的数组和指针。

 

数组:

数组的长度必须是字面值常量或常量表达式初始化的const对象。在函数体外定义的数组,其元素初始化为0,在函数体内定义的数组无初始化;类数组使用类本身的默认构造函数或显示构造函数进行初始化。

字符串字面值数组自动在末尾添加一个空字符,属于C字符串风格。

数组的长度和下标都是size_t类型的,使用时应包含头文件<cstddef>

 

指针:

指针为指向某一数据类型的变量,它本身占用内存,注意指针与引用(&)的不同。为了避免产生溢出错误,应尽量在使用时定义并初始化指针变量。C++中空指针负值为0C中赋值为NULLNULL是在cstdlib头文件中定义的,若使用应包含此头文件。

指针相减的值是ptrdiff_t类型的signed整型值,ptrdiff_tsize_t一样,是在cstddef中定义的。

在使用下标操作([])访问数组时,实际上是对指向数组的指针进行操作,因此只要指针指向数组元素,就可以对其进行下标操作以访问数组元素。

Const int *p为指向const int 对象的指针,int *const p是指向int数据的const指针,注意两者的区别。typedef int * pint;   const pint a得到的是一个指向int对象的const 指针,相当于 int *const a

创建动态数组:newdelete[]注意int *a=new int []()int *a=new int []是不同的,前者包含初始化,对const型的数组定义时必须使用前者。

 

多维数组:多维数组中最难理解的是指针问题,这里做一总结。

定义:int a[3][4]a是二维数组名,这里定义了一个三行四列的二维数组。a的值是一个地址,指向第一行的元素。对a的解引用得到的仍是一个地址*a,即a[0][0]元素的地址,**a=a[0][0]。对*a递增运算可以遍历a[0]的元素,a+1指向第二行,对*(a+1)进行递增可以遍历第二行的元素,如*(a+1)+1指向的是a[1][1]元素,对其解引用即得到a[1][1]的值,即*((a+1)+1)=a[1][1]

int (*p)[4]定义一个指向4个元素的数组的指针,p其实是一个指向指针的指针,若令p=a,则可以对p进行类似于a的上述解引用操作。int *p[4]定义一个指针数组,p是此数组名,也即数组的首地址,注意它与指向数组指针的区别。

typedef int int_arry[4]:将int_arry定义为一种类型名,可以用它来定义包含四个元素的int型数组,如int_arry a相当于int a[4]int_arry *p相当于int (*p)[4],这样定义更加直观。

 

程序:MS_files中的程序有点小bug,即在文件头加了std::size_t。由于size_tstddef.h中定义的,采用的是全局命名空间,因此不需要加std::size_t


https://wap.sciencenet.cn/blog-691244-568231.html

上一篇:C++Primer学习笔记
下一篇:C++Primer学习笔记
收藏 IP: 210.77.8.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-17 07:37

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部