C++ 数组和指针学习笔记


数组

定义及其初始化

1、数组的维数必须用值大于等于1的常量表达式定义(包括:整型字面值常量、枚举常量、用常量表达式初始化的整型const对象),非const变量以及到运行阶段才知道其值的const变量都不能用于定义数组的维数。

3、定义数组时没有显式的初始化,则:

----在函数体外定义的内置数组,元素均初始化为0

----在函数体内定义的内置数组,元素均无初始化

----无论在何处定义,若其元素为类类型,则自动调用其默认的构造函数初始化;若无构造函数,则必须为该数组的元素提供显式的初始化

2、字符数组可以使用字符串字面值进行初始化,但当使用字符串字面值来初始化字符数组时,将在数组后面加入空字符,例如:char A[] = "C++";  //A的维数是4

3、与vector不同,一个数组不能用另一个数组初始化,也不能将一个数组赋值给另一个数组

注意:数组长度固定,一旦定义,就无法添加新的元素。但是若要添加,则需要自己更改内存remalloc()以及malloc()函数可以实现

数组的操作

下标访问。下标的数据类型:size_t

指针

定义及其初始化

建议:尽量避免使用指针和数组

  指针和数组容易产生不可预料的错误。其中一部分是概念上的问题:指针用于低级操作,容易然生与繁琐细节相关的(book keeping)错误。其他错误则源于使用指针的语法规则,特别是声明指针的语法。

  许多有用的程序都可不使用数组或指针实现,现代C++程序采用vector类型和迭代器取代一般的数组、采用string类型取代C风格字符串。

指针可能的取值

  一个有效的指针必然是以下三种状态之一:保存一个特定对象的地址;指向某个对象后面的另一对象;或者是0值。若指针保存0值,表明它不指向任何对象。未初始化的指针是无效的,直到给该指针赋值后,才可使用它。

C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码

读C++ Primer 之构造函数陷阱

读C++ Primer 之智能指针

读C++ Primer 之句柄类

将C语言梳理一下,分布在以下10个章节中:

  1. Linux-C成长之路(一):Linux下C编程概要
  2. Linux-C成长之路(二):基本数据类型
  3. Linux-C成长之路(三):基本IO函数操作
  4. Linux-C成长之路(四):运算符
  5. Linux-C成长之路(五):控制流
  6. Linux-C成长之路(六):函数要义
  7. Linux-C成长之路(七):数组与指针
  8. Linux-C成长之路(八):存储类,动态内存
  9. Linux-C成长之路(九):复合数据类型
  10. Linux-C成长之路(十):其他高级议题

 int ival = 1024;
  int *pi = 0;      // pi initialized to address no object
  int *pi2 = & ival;  // pi2 initialized to address of ival
  int *pi3;            // ok, but dangerous, pi3 is uninitialized
  pi = pi2;       // pi and pi2 address the same object, e.g. ival
  pi2 = 0;        // pi2 now addresses no object

指针初始化和赋值操作的约束

  对指针进行初始化或赋值只能使用以下四种类型的值:

  (1)0值常量表达式。

  (2)类型匹配的对象的地址。

  (3)另一对象之后的下一地址。

  (4)同类型的另一个有效指针。

  把int型变量赋给指针是非法的,尽管此int型变量的值可能为0。

void*指针

  C++提供了一种特殊的指针类型void*,它可以保存任何类型对象的地址:

 double obj = 3.14;
  double *pd = &obj;
  // ok: void* can hold the address value of any data pointer type
  void *pv = &obj;        // obj can be an object of any type
  pv = pd;                // pd can be a pointer to any type

----void*表明该指针与一地址值相关,但不清楚存储在此地址上的对象的类型。
 
----void*指针只支持几种有限的操作:与另一个指针进行比较;向函数传递void*指针或从函数返回void*指针;给另一个void*指针复制。
 
 ----不允许用void*指针操纵它所指向的对象。

更多详情见请继续阅读下一页的精彩内容:

  • 1
  • 2
  • 3
  • 下一页

相关内容