前言:指针作为 C 语言中的精髓,也是最难的一部分内容,只要理解指针与内存之间的关系,也许你会有一个新的认识。
指针的基本概念
首先先看下指针的概念(摘自百度):
指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。
通俗的来说就是:
- 内存区的每一个字节都有一个编号,这就是“地址”。
- 如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)
- 指针的实质就是内存“地址”。指针就是地址,地址就是指针。
- 指针是内存单元的编号,指针变量是存放地址的变量。
- 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。
普通变量对应内存存储情况:
不同的类型的数据占用的字节数不同,例如 int
占用 4 个字节,char
占用 1 个字节。
指针变量对应内存存储情况:
指针存储的值是内存地址,且占用的字节数都是不会变的,在 32 位操作系统下是 4 个字节,64 位操作系统下是 8 个字节。
指针变量的定义和使用
- 指针也是一种数据类型,指针变量也是一种变量
- 指针变量指向谁,就把谁的地址赋值给指针变量
- “*”操作符操作的是指针变量指向的内存空间
先看一段代码
#include <stdio.h>
int main() {
// 定义整型变量a
int a = 10;
// 定义指针变量p
int *p;
// 指针变量赋值,指针变量p指向变量a的地址
p = &a;
printf("%p\n", &a); // 000000000061FE14(a变量的内存地址)
printf("%p\n", p); // 000000000061FE14(p变量存储的指针值)
printf("%p\n", &p); // 000000000061FE10(p变量的内存地址)
printf("%d\n", a); // 10(a变量存储的值)
printf("%d\n", *p); // 10(通过*操作指针变量指向的内存)
printf("%d\n", sizeof(a)); // 4(int类型占用内存的大小)
printf("%d\n", sizeof(p)); // 8(指针类型占用内存的大小,32位操作系统下是4个字节,64位操作系统下是8个字节)
return 0;
}
以上代码对应的内存存储情况:
总结:
p
存放的值 =a
的内存地址,也就是说p
存储的是a
的内存地址;- 通过
*
操作指针变量指向的内存的值,也就是说*p
取出来的是a
存放的值。
&
是取地址符号,是升维度的。
*
是取值符号,是降维度的。
野指针和空指针
野指针:指针变