C++ 4.数组、指针与引用

数组、指针与引用

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代替。
    
  • 使一个指针指向一个具体对象的方法:
    1. 通过new运算符给指针分配一个具体空间。
    2. 将另一个同类型的指针赋给它以获得值。
    3. 通过&运算符指向某个对象。
  • 指针运算:尽管指针存放的是变量的地址,但C++指针只能进行如下运算。
    1. 指针和整型量可以进行加减运算
      int *p;
      int i;
      p + i(返回下i个元素的指针,p本身不变);p - i,P++(结果为下一个元素); // 合法
      
    2. 若p1、p2均为指针,当二者指向同一类型时,可进行赋值:p2 = p1; 该语句使得两个指针p1和p2指向同一空间,若其中一个指针所指向的空间被释放,则另一个指针所指向的空间亦被删除,这就是指针悬挂问题。
    3. 两个指向同一类型的指针,可进行 ==,>,<等关系运算,其实就是地址的比较。
    4. 两个指向同一数组成员的指针可进行相减、结果为两个指针之间相差元素的个数。不可相加。
  • 特殊的指针
    • 空指针:不指向任何数据的指针为空指针,其地址值为0.(地址0不能用于存储数据,空指针专用)
      int * p = NULL;
      
    • 无类型指针;可以用void来定义一个指针变量,称为无类型指针或void指针。可以用来指向任何类型的数据,任何类型的指针都可以赋值给无类型指针。
      void * p = NULL;
      
    • const指针:
      1. 指针所指的数据为常量。定义这样的指针const放在*之前,如 const char * s=“hello”;s
        所指向的数据是不可变的,但s本身可以改为指向别的数据。
      2. 指针本身为常量,const放在*之后。可以改变s所指向的数据,但不可改变指针s本身,与前面情况相反。

引用

引用是个别名,建立时必须用另一个数据对象的名字进行初始化,以指定该引用所代表的数据对象。此后,对引用的任何实际操作实际上就是对所代表的数据对象的操作。系统不会为引用再次分配存储空间。

int i=1;
int &r = i; // r和i现在引用同一个对象

使用引用时应遵守一定的规则:

  1. 创建引用时,必须立即对其进行初始化。
  2. 一旦一个引用被初始化为一个对象的引用,就不可改变。
  3. 不可能有NULL引用。必须确保引用是对具体合法对象的引用(引用应该和一块合法的存储空间相关联)。

用引用传递函数参数:如果占用空间大的对象需要作为函数参数传递时,c语言中往往使用指针,因为可以避免将整个实参对象数据全部复制给形参,可以提高程序允许效率。c++中既可以使用指针也可以使用引用。引用相比指针来说具有更好的可读性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值