#M8401. 指针
指针
指针
计算机的内存空间中最小单位是bit(位),其值只能是 0 或 1。
字节(byte)是计算机中的基本单位,一个字节由 8 个 bit 组成。
一般计量都是以字节为单位的,比如每个
char
类型数据占 1 个字节,int
类型数据占 4 个字节,double
类型数据占用 8个字节。
在操作系统中,所有内存单元都被编上了序号,通过这些编号(即内存的地址),可以快速找到内存单元,更灵活、高效的管理数据。
指针的基本概念
计算机中的数据都是存储在内存中的,每条数据都有自己的地址,指针就是用来记录地址的变量。
图中: c
是一个字符型变量,值为 'A'
,存储在地址为 0x6ffdc0
的内存单元中。
p
是一个字符型指针变量,其值为 0x6ffdc0
,也就是变量 c
的内存地址。在这种情况下,可以说 p
是一个指向变量 c 的指针。
指针的值是一个内存地址,这个地址可以是变量的首地址,也可以是数组的首地址;指针的类型表示指针所指地址上存储的数据的类型。
指针的定义
指针变量定义一般格式:类型 *指针名;
例:
int *p1; // 声明一个指向整数的指针变量 p1
double *p2; // 声明一个指向双精度浮点数的指针变量 p2
char *p3; // 声明一个指向字符的指针变量 p3
指针的使用
一、确定指针的指向
指针的值必须是一个地址,为保证它的有效性,可以借助取地址符“&”获取某个变量的地址。
int a;
int *p1 = &a;//定义指针的同时为其初始化一个地址
int *p2;
p2 = &a;//先定义个指针,需要用的时候才指定一个地址
【注意事项】
- 两种方法是等价的,不过推荐使用第一种方法,这样可以保证一开始指针就是有效的。未经初始化的指针将指向一个不确定的内存地址,操作这样的指针是非常危险的。
- 注意,在上面指针的定义中,指针变量是 p2 而不是 *p2,因此要给指针赋值,等号左边是 p2 而不是 p2。另外,不允许把一个无效的地址(比如数字)赋给指针。
指针变量和普通变量是一样的,存放的值是可以改变的,可以改变指针的指向。
int a, b;
int *p = &a; // 指针 p 指向变量 a
p = &b; // 修改 p 的指向,令它指向变量 b
二、获取指针指向的数据
需要指针所指向的数据时,可以使用解引用操作符 "*" 得到指针所指向的变量。
int x = 3;
int *p = &x;
cout << x << ' ' << *p << '\n';
//直接使用x和间接的访问x
x = 0;// 同 *p = 0;
//两个赋值语句是等效的
三、指针的算数运算
指针加减某个整数,是将该指针移动整数个变量的长度。
例如 p + j
是将指针 p
向后移动 j
个单位(每个单位大小为指针 p
类型的字节数),指向 p
原先指向元素后的第 j
个元素。
#include <bits/stdc++.h>
using namespace std;
int main(){
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
cout << p << ' ' << *p << '\n';//0x73fdf0 1
cout << p + 2 << ' ' << *(p + 2);//0x73fdf8 3
return 0;
}
*p++ |
先获取 *p 的数据后再让 p+1 |
---|---|
(*p)++ |
先获取 *p 的数据后再让 *p 的数据自增 1 |
*++p |
先将 p 自增 1,再获取 *p 的数据 |
++*p |
先将 *p 的数据自增 1,再获取自增后的结果 |