四章 札记--C++ primer 之旅

本文详细介绍了C++中的指针与数组概念,包括有效指针的状态、未初始化指针的风险、特殊指针类型void*的作用、指向指针的指针、指针与数组的关系及运算、以及如何使用new和delete管理动态数组等内容。
摘要由CSDN通过智能技术生成
数组的类型 不能是引用。即不存在引用的数组。

数组:
        char s[]="C++";   等价于  char s2[]={'c','+','+','\0'};
          
         数组下标的正确类型是 size_t


指针: 
     理解指针声明语句时,从右往左阅读。
     EX :string *pstring ;  把 pstring 定义为 指向string 的指针。

有效的指针 的三种状态:
     1)一个特定对象的地址         EX: int ival;  int *pint=&ival;
     2)某个对象后面的另一对象     
     3)0值,不指向任何对象       EX:  int *pint=0;   数值0 或 编译时可获得0值的const 变量     EX : const int c_ival=0;   int *pi=c_ival;  或者是 cstdlib  头文件定义的预处理变量NULL.   int *pi=NULL;

未初始化的指针是无效的,dangerous的。

特殊的指针类型 void * 可以保存任何类型对象的地址。

指向指针的指针: 
     EX: int ival=1024;
             int *pi=&ival;
             int **pi=π

指针 和 数组
     注: 表达式中使用数组名时,自动转换为指向数组第一个元素的指针。

指针的算术操作:
     int ia[10];
     int *ip=ia;          // ip points to ia[0];
     int *ip2=ip+4;     //ip2 points to ia[4];
     
     指针间隔: ip2-ip    结果4   类型是  ptrdiff_t   (标准库类型)


指针和下标:
     int ia[]={0,2,4,6,8};
     int *p=&ia[2];
     int j=p[1] ;           // p[1] = *(p+1);  p[1] = ia[3];
     int k=p[-2];          // p[-2]=*(p-2);    p[-2]=ia[0];

数组的超出末端指针,相当于 vector.end() ; 常用作哨兵。
     EX:  
          const size_t arr_size=5;
          int arr[arr_size];
          int *p=arr;
          int *p2=p+arr_size;
     注:允许计算数组或对象的超出末端的地址,但不可以对此地址进行解引用操作。

指针和 const 
1、 指向const对象的 指针。
      tip: 指向const的指针 自以为指向const 的指针。
       EX: const  double *cptr;     或 double const *cptr;
      不能把一个void * 保存const 对象的地址。必须使用 const  void *
     
      允许把非const 对象的地址 赋给指向const对象的指针。此时则不能通过该指针修改该变量的值

2、const 指针
     指针本身的值不能修改
     EX: int ival=5;
             int *const ptr=&ival;

3、指向const 对象的const 指针
     以上1、2 的并集吧

4、指针 和 typedef
     typedef string *pstring;
     const pstring cstr;
     pstring const cstr;
     解析: pstring 是 指向string 的指针,而const 修饰的是pstring ,所以 cstr 为指向string 的const指针。定义等价于   string  *string  cstr;


注意: 字符串字面值的类型就是const char 的数组。
           EX: const char *cp1 = "a string example";

数组类型的三个重要的限制:
     1) 数组长度固定不变
     2)编译时必须知道其长度
     3)数组只在定义它的块语句内存在

动态数组: 运行时才确定数组长度, 动态数组将一直存在,直到程序显示释放它。
动态数组存放在程序的自由存储区或堆的操作:
C     库函数 malloc 和 free 
C++           new     和 delete

初始化:  1)类类型: 默认构造函数;2) 内置类型,无
可以通过 int *pia = new int[10](); // 元素设置为0,比如const对象的动态数组。

注意: C++ 不允许定义长度为0的数组变量,调用new动态可以创建长度为0的数组是合法的。

动态空间的释放: delete []释放指针所指向的数组空间 注意:[] 告诉指针指向的是数组。必不可少,否则会内存泄露

string.c_str() ; 返回C风格字符串。 返回类型是 const char *

数组初始化vector 对象:
vector<T> ivec(int_arr,int_arr+arr_size); 参数: 数组的第一个元素和最后一个元素的下一个位置的地址


定义指向数组的指针: 声明元素类型、数组变量名字和维数;
EX:
     int ia[3][4];
     int (*ip)[4]=ia;     //  ip 指向 长度为4的int数组
     ip=ia[2];              //   ia[2] 就是长度为4的int数组


int (*ip) [4] 从内向外理解: *ip 是 int[4] 类型 -- 即ip 是指向含有4个元素的数组的指针。

辨析:
     int *ip[4];          // 整型指针的数组,长度为4
     int (*ip) [4];      

用 typedef 简化指向多维数组的指针。
     typedef int  int_array[4];
     int_array  *ip = ia ;   等价于上面的定义





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值