0. 地址操作 — 指针
指针是C/C++语言中一个重要的数据类型,能否正确理解和使用指针是衡量是否掌握该语言的一个标志。
1. 指针的概念
- 内存——由内存单元构成
- 内存单元的地址
- 指内存单元的编号
- 内存单元的内容
- 存放在内存单元中的数据
- 内存单元的地址
- 在C/C++语言中,每个变量都分配有确定的内存空间。
- 使用变量名可直接访问内存中的数据;
- 通过变量的地址也可间接访问内存中的数据。
- 特殊变量 —— 指针
- 存放“地址”(指针)的变量 —-> 指针变量
- 变量的地址 —-> 变量的指针
- 指针用途:
- 参数传递
- 指针作参数可以实现参数按引用传递的功能
- 动态分配
- 利用动态分配可构建动态数组,动态数组需要借助指针实现
- 数据结构
- 创建可伸缩的数据结构,如链表、棧与队列、树和图等
- 参数传递
2. 变量与指针
变量有地址,指针变量可以存放变量的地址。当指针变量中存放某个变量的地址后,我们就说
该指针变量指向这个变量。
使用指针变量的三个步骤:
- 定义指针变量, 即给指针变量分配内存空间;
- 指针变量的定义格式:
数据类型 * 变量名; (数据类型 * —-> 表示指针类型)- ”*”是指针类型变量的标志符号;
- 变量名–为指针变量名(构成同标识符);
- 数据类型–为指针变量所指向变量的数据类型;
- 指针变量的定义格式:
-
对指针变量赋值, 即使指针变量指向某对象,该对象可以是变量、数组、函数或动态分配的一块内存空间等;
- 指针变量初始化:
在定义指针变量的同时为指针变量提供初值。如: int a=5,*pta=&a; 其中a的初值为5,pta的初值为整型变量a的地址。 这时,pta与a的关联如下:
-
使用赋值语句为变量提供初值:
上述定义语句:int a=5,*pta=&a;
与下面语句组的功能是等效的。int a,*pta; //先定义变量
a=5; //使用赋值语句提供初值
pta=&a; //使用赋值语句提供初值- 提醒:
pta=&a; 不可写成:*pta=&a;
因为, *pta并不表示指针变量pta,而表示pta所指向的变量a。指针变量与指针所指向的变量是两个完全不同的概念。
- 提醒:
- 定义多个指针变量
例如:double *p1,*p2;
(每个指针变量前面都有*)- 定义2个双精度型的指针变量p1和p2,它们只能指向 double型变量。
- 变量p1和p2的类型为:double *
- 指针变量初始化:
-
通过指针变量间接访问所指向的对象:
(1)&-取地址运算符
&变量名 //获取变量的内存单元地址
(2)*-指针运算符(也称为间接访问运算符)
*指针变量名 或 *指针常量 //表示该指针所指向的 变量 - 示例:
- 注意:
- 不要访问没有被初始化的指针变量
如:int *p; cin>>*p; // 这样使用指针p是危险的!
由于p变量未初始化,p中可能存在一个不确定的单元地 址,这时的输入将会改变原存储单元的值,造成结果混
乱。 - 指针变量可以有空值,即该指针变量不指向任何变量
常用符号常量NULL表示空指针值,其实NULL代表的值 是整数0。编译系统约定0号单元不存放有效数据。
- 不要访问没有被初始化的指针变量