C++程序设计案例教程(学习笔记)——Cha3指针和引用

3.1指针
3.1.1 指针变量的定义

  1. 指针变量的定义格式:
    <指针类型> *<指针名>;
    例:int *p ;定义一个名为p的指针变量,改变量指向的存储空间只能存放整形数
    int (*pf) ( ); pf是一个指向函数的指针,该函数的返回值为int型数值
    注:int *p,p2;定义了一个整型的指针变量和一个整型的变量
    int *p1, *p2 ; 定义了两个整型的指针变量
  2. 指针变量的赋值
    例:int *p=&x; 指针变量指向存储变量x的地址
    // 也可用下面的方式来进行指针变量的赋值
    int *p;
    int x;
    int p=&x;
    例:double Fun(double x,double y);
    double (*pf)(double,double);
    pf=Fun; //pf是一个指向函数Fun()的指针,将函数Fun()的首地址赋给pf
  3. 指针变量的运算
    例:int x;
    int *p=&x;
    *p=40; //通过指针改变变量的内容
    例:double Fun(double x,double y);
    double (*pf)(double,double);
    pf=Fun;
    pf(a,b,c); //通过指向函数的指针来调用函数
    指针变量的加减运算
    int p;
    int n;
    。p+n;
    此处的p+n,不是简单的把n直接加到p上,而是p+4
    n,4这个乘数因子就是指针类型在实际存储时所占单元的个数,int型4个字节,char型1个字节,double型8个字节。即p+n的操作可看成将指针向后移动n个指针变量型的数。
    注:无论指针进行何种运算,所产生的地址不能是无效的或危险的地址,且指针的访问操作必须有意义。
    3.1.2 指针的指针
    二级指针的定义格式
    <指针类型> *<指针类型>;
    定义几级指针就在指针名前加几个

    例: int *p1=&x, **p2=&p1,***p3=&p2;
    不建议在编程中使用多级指针
    3.2 指针与数组
    如果对程序的运行有速度要求,使用指针表式数组中的元素要比用下标表式处理起来更快。
    1. 一维指针与数组
      C++中任何一个数组的名字都是指针常量,该指针的值便是该数组首元素的地址值。
    2. 二维指针与数组
      例:double x[3][2];
      二维数组元素表达方式:
      (1)(x+i)+j) 行列数组均用指针表式
      (2)x[i][j] 数组表式
      (3)(x[i]+j) 行数组用下标表式
      (4)(
      (x+i))[j] 列数组用下标表式
    3. 三维数组的指针表示
      例:double x[3][2][4];
      三维数组元素表达方式:
      (1)(((x+i)+j)+k) 行列组均用指针表示
      (2)
      ((x[i]+j)+k) 行数组用下标表示
      (3)
      (((x+i)[ j])+k) 列数组用下标表示
      (4)(
      (*(x+i)+j))[k] 组数组用下标表示
    4. 指向数组的指针
      定义格式:
      <指针类型>(< *指针名 >)[<大小>]
      例:int (*p)[5]; //定义一个指向含有5个元素的一维数组的指针p
      int (*p)5;//定义指向数组a的指针
    5. 指针数组
      定义格式:
      <类型> *<数组名> [c1] [c2]…[cn];
      有几个“[ ] ”就表示几维的指针数组
      例:int *p[3] //定义一个包含三个整型指针变量的数组
      char *string[]={“abc”,”def”,”ghi”} /string指针数组有三个元素,每个元素是一个char型指针,其初值分别是“abc”,”def”,”ghi”的首地址。/
      3.3 字符串
      3.3.1 C风格字符串
      1. C风格字符串初始化
        1) char str[4]={‘y’,’p’,’o’,’\0’}; //手动添加结束符
        2) char str[4]=”ypo”; //自动添加结束符
        3) char *p=“ypo” // p指向字符数组的指针,通过对指针的递增和递减来进行逐个访问字符串中的字符
        2.C 风格提供的字符串函数
        注:使用时要包含string.h
        1)字符串长度函数strlen()
        int strlen(const char *s);
        说明:返回字符串s的长度,不包含字符串结束符’\0’
        2)字符串比较函数strcmp()
        int strcmp(char *s1,char *s2)
        说明:比较字符串s1与字符串s2是否相等,如果相等函数返回值为0;如果s1>s2,则函数返回大于0的值,如果s1<s2,则函数返回小于0的值。
        3)字符串联接函数strcat()
        char *strcat(char s1,chars2); 说明:s2添加到s1后面,返回该新字符串。
        char *strcat(char s1,chars2,int n); 说明:在s1后面仅仅连接s2所指字符串的前n个字符串。
        4)字符串拷贝函数strcpy()
        char *strcpy(char *s1,char *s2);说明:将s2所指向的字符串复制到s1 所指向的字符串中。
        char *strcpy(char *s1,char *s2,int n);说明:仅将s2所指向的字符串中前n个字符复制到s1中。
        注:必须保证s1所指向的字符串能够容纳下s2所指向的字符串,否则产生错误。
        3.string类型
        string类型能自动根据文本大小确定相应的存储空间,故用string类型定义的字符串末尾不需要使用‘\0’作结束符。
        例:string str=”lxs”; 字符存储长度为3;
        char str[]=”lxs”; 字符存储长度为4;
        string类型函数
        (1)clear()清空成零长度的值
        (2)empty()判断字符串是否为空
        (3)length()返回字符串的个数
        (4)c_str()建立一个风格的字符串常量
        (5)swap()交换两个字符串中的内容
        C++中的string类型,可以对文本信息更方便和更安全的处理。
        C风格字符串执行速度快,使用C字符串更合适
        3.4 引用
        C++独有数据类型,引用是对一个变量或常量标识符起别名
        引用格式:
        <数据类型> &<引用名>=<变量名>
        例:int a;
        int & p=a;//声明p是对整数的引用,初始化变量为a,即定义a的引用p。
        当编译程序时,看到&不会给后面的标识符分配存储空间,而是将所引用的那个标识符所具有的内存空间赋给它。引用对象和被引用对象地址一样,所以它们同步变化。
        注:1)创建一个引用,该引用必须初始化
        2)一旦一个引用被初始化指向一个变量,则它不能改变对另一个变量的引用
        3)不能有空引用
        4)不能对地址进行引用,例如不能对数组名引用
        1.指针和引用的区别
        1)对变量的操作方式不一样
        p=10;//指针通过进行访问空间中的值。
        int &p=a;
        p=2;//引用直接访问。
        2)指针是一个变量,指向一个空间后还可以指向其他空间,而引用只能一旦被初始化后,则不能改变。
        2.优缺点:指针更加灵活,但容易发生错误,引用相当于更加高级封装,更加安全不容已发生错误,鉴于它只要被初始化就不能再改变,它灵活性不如指针。

        3.5 指针和引用在函数中的应用
        1)做函数的参数
        2)做函数的返回值
        通过对函数的调用,函数返回一个值,可在很多情况下,为了让函数返回多个值,就可以使用指针和引用给给函数传递多个参数。

猜你喜欢

转载自blog.csdn.net/qq_40719550/article/details/83242424