#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,再获取自增后的结果