一个简单的目录
前言
指针是C和Cpp的重要特色,它为程序员提供了直接访问物理内存的手段。本文介绍了指针的一些基础知识,例如 指针到底是什么? 、如何定义一个指针变量及初始化 和 间接寻址运算符。如有问题,欢迎看文的小伙伴提醒博主~
正文
指针的本质
在具体讲指针的本质之前,需要从内存的结构说起。
计算机访问内存的最小单位是字节(Byte),计算机为每个字节分配了一个地址,目的是实现对字节的正确读取。
举个例子:
对于一个4G内存的计算机系统,其内存地址为0 ~ (2^32) - 1(即4 * 1024 * 1024 * 1024 ,0~FFFFFFFF)。而我们知道,变量根据其数据类型会占有的一个或者多个字节,比如int型占有4个字节。而对于编译器来说,它把第一个字节的地址视为变量的地址,具体可以看下图:
int型变量a占有了地址为6000-6003这4个字节。因而我们可以认为,变量a的地址就是6000。
我们还可以这么认为:
6000指向了变量a对应的存储单元!这便是指针的由来。
因而,指针的本质就是内存地址。
指针变量的定义与初始化
1. CPU访问内存的两种方式
我们先介绍CPU访问内存的两种方式,进而引入指针变量的概念:
通常CPU在访问内存的时候有两种方式:直接寻址方式和间接寻址方式。
-
直接寻址方式:在编程时直接给出变量的地址
例如,对变量执行scanf(“%d”, &a),通过取地址符“&”来告诉CPU int变量a的地址,然后从键盘中输入的值将被存放进地址为6000开始的四个字节中。
-
间接寻址方式:在指令中不直接给出变量的内存地址,而将该变量的地址事先存放于某寄存器或者某内存单元中,在指令中给出的是存储了该变量的地址的寄存器或变量。
例如,可以先把变量a的地址6000存放在变量p中,CPU先通过读取p的内容,然后根据p的内容来间接地访问变量a。
其中,上文中提到的变量p便是一个指针变量。
我们可以总结一下:指针就是地址,而指针变量是存储地址的变量。有的时候会把指针变量简称为指针,具体含义需要自己去判断一下。指针变量不仅可以存储普通变量的地址,还可以存放结构体和数组的地址。
2. 指针变量的定义