数组、指针与引用
c++提供的导出数据类型:数组、指针和引用。
- 数组:常用于处理大量集中在一起的数据。
- 指针:用来操纵地址的特殊类型变量,可作为函数的参数用来传递数组变量,也可用来访问和操作内存空间。是理解许多C++语言现象的关键。
- 引用:是C++引入的新概念(C语言中没有引用的概念),在很多情况下使用引用会提高程序可读性。
数组
数组是由固定数目元素组成的数据结构,同一数组内的元素类型相同。数据元素是通过下标访问的。数组可以是一维的,也可以是多维的。许多重要的数据结构都是基于数组实现的。
- 一维数组
- 定义:<数据类型> <数组名>[<数组长度>]; int v[5];
- 初始化:
int v[] = {1,2,3,4}; // 定义时初始化,数组大小默认为元素的个数 int v[2] = {1,2,3}; // 如明确给出数组大小,若元素个数超出就是错误的 int v[4] = {1,2} // 初始化列表中的元素不够时,其余元素默认初始为初始值
- 访问数组元素:通过下标访问。下标范围:0 - (数组大小-1)
- 指定下标元素赋值: <数组名>[下标] = 值;
- 二维数组
- 定义:<数据类型> <数组名>[<数组长度1>(行)][<数组长度2>(列)]; double table[5][10];
- 初始化:
int list[4][3] = {{1,3,5},{2,4,6},{3,5,7},{0,0,0}};
- 访问数组元素:<数组名>[<数组长度1>(行)][<数组长度2>(列)]
- 多维数组:c++中并没有对数组的维度进行限制。
- 定义:<数组名> <数组名>[<数组长度1>][<数组长度2>]···[<数组长度n>]
- 访问:<数组名>[<数组长度1>][<数组长度2>]···[<数组长度n>]
String类型
标准c++库并没有提供string类型。string是一种用户自定义的数据类型,由标准c++库来支持,而不是c++语言的一部分。
在使用string数据类型之前,需要在程序中包含头文件string并声明其所在的命名空间std
# include<string>
using namespace std;
string name = "hello world"; // c++中,字符串由零个或多个字符组成,用""括住
字符串常用函数(都包含在头文件cstring中):
- 字符串拷贝
char * strcpy-s(char * s1, char * s2); //将字符串s2拷贝至变量s1中,s1的长度应大于等于s2.成功返回0,失败返回非0.
- 字符串拼接
char * stract-s(char * s1, char * s2); //将s2的内容增加到s1末端。成功返回0,失败返回非0.
- 字符串比较
int strcmp(char *s1, char * s2); // 比较字符串长度,返回s1 - s2 的长度差值
- 返回字符串长度
int strlen(char * s) // 返回字符串的长度,不包含末尾的空值"\0"
- 字符串查找
char * strstr(char * s1, char * s2); // 在s1中查找s2,成功返回首次出现的位置,失败返回NULL
字符数组
所有元素都是char类型的数组称为字符数组。
char str[100];
目前使用最广泛的字符集是:
- ASCII:此字符集中第一个字符是不可打印的空字符(NULL Character)。 用"\0"表示,空字符在处理字符数组中起到身份重要的作用,c++中,空字符默认作为一个字符串的标志。
- 字符串:字符串最好一个字符必须是空字符("\0")。
- 字符数组:字符数组可以不包含空字符。
- EBCDIC
指针
指针(指针变量)是C++语言最强大的功能之一。尽管容易被误用,但仍然是C++编程至关重要的组成部分。
一个指针是一个特定类型数据的存储地址。
- 声明: <数据类型> * <变量名>; int * ip;
- 运算符:
- &:根据变量返回其物理内存地址。
- *:返回指针对象返回指针指向的对象的值。
int * iPtr; int iCount = 18; iPtr = &iCount;
- 指针与所指对象的关系
int *px; // 指向整型的指针 char *pc; // 指向字符型的指针 char *acp[10]; // 指向由字符型的指针构成的数组,即指针数组 char( *pac )[10]; // 指向字符数组的指针,即数组指针 int f(); // 返回值为整型的函数 int *fpi(); // 返回值为指向整型的指针的函数,即指针函数 int( *pfi)(); // 指向返回值为整型的函数的指针,即函数指针 int(*p[4][3])(); // 指针数组,数组中每个元素都是指向返回值为整型量的函数的指针 int *(*pfpi)(); // 指向函数的指针,该函数的返回值为指向整型量的指针 int x = 100; int *px; px = &x; //指针px指向具体对象x,*px为px所指对象的值(100),以后所有对x的引用,都可使用*px代替。
- 使一个指针指向一个具体对象的方法:
- 通过new运算符给指针分配一个具体空间。
- 将另一个同类型的指针赋给它以获得值。
- 通过&运算符指向某个对象。
- 指针运算:尽管指针存放的是变量的地址,但C++指针只能进行如下运算。
- 指针和整型量可以进行加减运算
int *p; int i; p + i(返回下i个元素的指针,p本身不变);p - i,P++(结果为下一个元素); // 合法
- 若p1、p2均为指针,当二者指向同一类型时,可进行赋值:p2 = p1; 该语句使得两个指针p1和p2指向同一空间,若其中一个指针所指向的空间被释放,则另一个指针所指向的空间亦被删除,这就是指针悬挂问题。
- 两个指向同一类型的指针,可进行 ==,>,<等关系运算,其实就是地址的比较。
- 两个指向同一数组成员的指针可进行相减、结果为两个指针之间相差元素的个数。不可相加。
- 指针和整型量可以进行加减运算
- 特殊的指针
- 空指针:不指向任何数据的指针为空指针,其地址值为0.(地址0不能用于存储数据,空指针专用)
int * p = NULL;
- 无类型指针;可以用void来定义一个指针变量,称为无类型指针或void指针。可以用来指向任何类型的数据,任何类型的指针都可以赋值给无类型指针。
void * p = NULL;
- const指针:
- 指针所指的数据为常量。定义这样的指针const放在*之前,如 const char * s=“hello”;s
所指向的数据是不可变的,但s本身可以改为指向别的数据。 - 指针本身为常量,const放在*之后。可以改变s所指向的数据,但不可改变指针s本身,与前面情况相反。
- 指针所指的数据为常量。定义这样的指针const放在*之前,如 const char * s=“hello”;s
- 空指针:不指向任何数据的指针为空指针,其地址值为0.(地址0不能用于存储数据,空指针专用)
引用
引用是个别名,建立时必须用另一个数据对象的名字进行初始化,以指定该引用所代表的数据对象。此后,对引用的任何实际操作实际上就是对所代表的数据对象的操作。系统不会为引用再次分配存储空间。
int i=1;
int &r = i; // r和i现在引用同一个对象
使用引用时应遵守一定的规则:
- 创建引用时,必须立即对其进行初始化。
- 一旦一个引用被初始化为一个对象的引用,就不可改变。
- 不可能有NULL引用。必须确保引用是对具体合法对象的引用(引用应该和一块合法的存储空间相关联)。
用引用传递函数参数:如果占用空间大的对象需要作为函数参数传递时,c语言中往往使用指针,因为可以避免将整个实参对象数据全部复制给形参,可以提高程序允许效率。c++中既可以使用指针也可以使用引用。引用相比指针来说具有更好的可读性。