内存地址
- 字节:字节是内存的容量单位,英文名Byte,1Byte = 8Bit = 1Char
- 地址:系统为了便于区分每一个字节而对他们逐一进行编号(编号唯一),称之为内****存地址,简称地址。

基地址(首地址)
- 单字节数据:对于单字节数据,其地址就是其字节编号。举例:char a = 'A';
- 多字节数据:对于多字节数据,其地址是所有字节中编号最小的那个,称为**基地址,**或者首地址

指针**==**地址
指针的目的是为了进行寻址操作,找到对应的内存。
内存
- 虚拟内存:实际上是硬盘上的一块区域
- 物理内存:计算机中安装的硬件内存(比如:内存条)
RAM:随机存储器,用于临时存储数据,读写速度快
- 虚拟内存
内存总大小:4G
内存单元:每个内存单元大小 节(byte)
内存单元总数:
内存块:地址空间连续的多个内存单元
地址:每个内存单元都有一个对应的地址,我们称之为内存地址,而地址我们通常使用十六进制表示。
寻址:通过地址找到对应的内存
取地址符
-
每个变量都是一块内存,都可以通过取地址符 & 获取其地址(基地址)。
-
例如:
int a = 100;
printf("整型变量a的地址:%p\n", &a); // 0x7ffd3f7d7894 64位系统下:地址是12位16进制整数,占8字节
char c = 'x';
printf("字符变量c的地址:%p\n", &c); // 0x7ffd3f7d7895 -
注意:
- 虽然不同的变量的尺寸是不同的,但是它们的地址的尺寸是一致的。
- 不同的地址虽然形式上看起来是一样的,但由于它们代表的内存尺寸和类型都不同,因此他们在逻辑上是需要严格区分
变量指针与指针变量
指针的概念
内存单元与地址机制
- 内存单元划分
- 系统将内存划分为连续的基本存储单元,每个单元的容量为1字节(8 Bits)
- 每个内存单元 拥有唯一编号,称为内存单元(64位系统下,12位16进制表示:如: 0x7ffe382a8114 )
- 变量的存储特性
- 变量根据数据类型占据不同数量的内存单元:
- char 类型占1字节(1个单元)
- int 类型占4字节(4个单元)
- double 类型占8字节(8个单元)
- 变量的**基地址(首地址)**是其首个内存单元的地址(首地址一般是这一组编号中最小的那个)
- 变量根据数据类型占据不同数量的内存单元:
指向
指针变量中存放谁的地址,就说明该指针变量指向谁。举例:
int a = 10; // 变量a,存放常量10
int* p = &a; // 指针变量p,存放变量a的地址,此时我们可以说 指针变量p指向对象a
int b = 20;
p = &b; // 指针变量p指向对象b
double c = 12;
double *p1 = &c;
指针的本质
- 变量指针:数据的"门牌号"(&a)
- 指针变量:存储门牌号的"笔记本"(int *p; 指针变量存储的地址所指向的对象的类型是int类型,不能说指针变量是int类型)
- 指向操作:通过门牌号访问数据(*p)
直接访问
-
通过基本类型(整型、浮点型、字符型)的变量,访问这个变量代表的内存空间的数据。
-
通过数组元素的引用(下标),访问这个引用代表的内
// 基本类型的变量
int a = 10 ; // 存
printf("%d\n", a); // 取
// 数组元素
int arr[] = {11,22,33}; // 存
arr[0] = 66; // 存
printf("%d\n", arr[0]); // 取
间接访问
- 通过指针变量,间接的访问内存中的数据。

指针变量的定义
语法:
// 写法1
数据类型 *变量列表;
// 写法2
数据类型* 变量;
注意:指针变量的值只能是8(32位系统)| 12(64位系统)位的十六进制整数。
注意:
① 虽然定义指针变量 *a ,是在变量名前加上 * ,但是实际变量名依然为 a ,而不是 *a
② 使用指针变量间接访问内存数据时,指针变量必须要明确指向。(指向:指针变量存放谁的地址,就指向谁)
③ 如果想要借助指针变量间接访问指针变量保存的内存地址上的数据,可以使用指针变量前加 * 来间接返回访问。
④ 指针变量只能指向同类型变量,借助指针变量访问内存,一次访问的内存大小是取决于指针变量的类型。
⑤ 指针变量在定义时可以初始化,这一点和普通变量一致。(指针变量本质上还是变量,只不过存放的是地址)
指针变量的使用
使用
-
指针变量的赋值
// 方式1
int a, *p;
p = &a; // 先定义,后赋值
// 方式2
int a1, *p1, *q1 = &a1; // 定义并初始化
p1 = q1; // 变量的赋值,将q1的值赋值给p1,此时q1和p1都指向了a1 -
操作指针变量的值
int a, *p , *q = &a;
p = q; // 指针变量的赋值,将q的值赋值给了p,此时p,q都指向了a
printf("%p\n", p); // 访问p的值(也就是a的地址) -
操作指针变量指向的值
int a = 6, *q = &a, b = 25;
*q = 10; // 赋值操作,修改q指向的a的值,此时 a = 10
printf("%d,%d\n", *q, a); // 10,10
q = &b; // 赋值操作,给指针变量q重新赋值,此时q指向b
printf("%d,%d\n", *q, a); // 25,10
指针运算符的使用
& :取地址运算符。&a是获取变量a的地址值。这个是变量指针。
* :指针运算符、间接访问运算符,*p是指针变量p指向的对象的值。这个是指针变量。