4. 数组和指针

来源:互联网 发布:中文维基百科数据库 编辑:程序博客网 时间:2024/06/03 09:18
  • 数组

    • 数组的维数必须值大于等于1的常量表达式定义(整型常量,枚举常量,const修饰已初始化的对象),不能为非const变量或者在运行阶段才知道值的const变量。
    • 不允许数组直接复制和赋值。(只能循环一个个赋值)
      int a2; //不能用另外一个数组初始化
      a2 = a; //不能用另外一个数组赋值
    • 数组下标的正确类型为size_t,如:
      for(size_t i = 0; i != array_size; i++){}
    • 尽量不要用指针和数组。可使用vector和迭代器代替一般数组,string代替C中字符串。
  • 指针

    • 通常不要使用string* p; 定义指针,使用string *p;定义。
      string* p1, p2; //p1是指针,p2是string类型;
      string* p1, *p2; //p1,p2都是指针
      “*”只能就近管一个变量。
    • 对指针进行初始化或者赋值,只能:
      0或者const的0值常量表达式;(0表示未被初始化)
      类型匹配的对象的地址;(完全同一类型,int和double指针不能相互赋值)
    • void* 指针不允许其操纵它所指向的对象,只支持以下操作:
      与另一个指针进行比较;
      向函数传递void*指针或从函数返回void*指针;
      给另一个void*指针赋值;
    • 指针和const
      通常从右向左看,如果变量和const之间没有*,则为const指针,即变量不可变但是指向的内容可以变;若有有*,则为const对象,即指针指向的内容不能改变;
      const double *p; // 指向const对象的指针
      const *double p; // 指向const对象的指针
      double *const p; // const指针
      const double *const p; // 指向const对象的const指针
      注意:不能把一个const对象赋值给一个普通的、非const对象的指针;但是可以把一个非const对象的地址赋给指向const对象的指针(并且此const对象的指针不能改变指向的内容,但是其他非const对象可以改变内容)
    • typedef、指针、const
      typedef string *pstring;
      const pstring cstr; // const指针
      pstring const cstr; // const指针
      string *const cstr; // const指针
      上述三者等价,特别是”const pstring cstr;”, 此句const修饰的是pstring的类型,而pstring是一个指针,因此是一个const指针。
    • 指针和引用的区别:
      1) 引用总是指向某个对象,因此定义引用时不初始化是错误的;
      2) 引用值是别名,给引用赋值之后,就始终指向同一个特定对象,即其地址就不会改变,修改时只能修改其所关联的对象的值。而指针则可以改变其指向对象的值(通过*),也可以让其重新指向一个新的地址。
int a = 1024, b = 2048;int *p = &a, *q = &b;p = q; // 则现在p、q均指向b,但是a、b存储的值不变,a = 1024, b = 2048;int a = 1024, b = 2048;int &p = a, &q = b;p = q; // 则现在p中的值变成了2048,相应a中的值也变为了2048. 
  • C 风格字符串

    • 概念:以null结束的字符串;
    • 尽量使用标准库string,因为标准库已经负责处理所有的内存管理问题,如字符串大小是否越界等等。尽量不要用c风格字符串;
  • 动态数组(new)

    • 数组类型变量的限制:1)数组长度固定不变;2)在编译时必须知道其长度;3)数组只在定义其的块语句内存在。
    • delete [] p; //必须有[], 才能释放数组所有元素。如果遗漏,必将导致出错。
  • 多维数组

int *ip[4];  // 指针数组,每个元素均存放地址int (*ip)[4];  // (*ip)相当于数组的名字,即(*ip)是int[4]类型的,即ip是一个指向含有4int元素的数组的指针。
0 0