总结
众所周知,内存可以看成一个一个相邻的格子(类比Excel),而数据就存储于这些格子之中(size大的变量占用格子数多,size小就占用小)。而每个格子都有自己的地址,即内存地址
(类似于一条街上相邻的房间都有自己的门牌号,餐厅相邻的包厢也有自己的编号)。
- 什么是指针变量?指针变量是一类特殊的变量,它用于存储的值是什么?是一个内存地址,是某个变量的内存地址。
- 给你一个变量名,如何获取该变量所在的内存地址?要用到
取地址符&
。举例:int age = 25;
而&age
就可以取到age
变量的地址。 - 给你一个指针变量,如何得到
该指针指向的变量的值
? 格式:*指针变量
即可。
Intro
C语言中有一类特殊的变量:指针变量(pointer variable),用于存储某个变量的内存地址的值
。
要打印指针变量一般用%p
格式符,会打印出该指针变量的值,即一个内存值。
Code
// Created by wuyujin1997 on 2023/1/23.
#include <stdio.h>
int main() {
int age = 25;
int* p = &age;
printf("age = %d\n", age); // 打印一个int变量的值
printf("&age = %p\n", &age);// 该变量的内存地址。 【&变量名】取到该变所在的内存地址
printf("p = %x\n", p); // 打印该指针变量的值。指针变量中存的是特殊类型的值:【某个其他变量的内存地址】。
printf("*p = %d\n", *p); // 指针变量p中存着一个内存地址,这个内存地址处的变量的值是多少?
// 【*指针变量名 指针变量-->普通变量内存地址-->普通变量的值 】依次取值两次:1. 拿到指针变量中存储的值。2. 以该值为内存地址,取对应内存处的变量的
// age = 25
// &age = 0x16fdff218
// p = 6fdff218
// *p = 25
return 0;
}
图示
想了一下,用 Excel 演示最方便,也比较直观。
假设我用下面的电子表格表示我电脑的内存,其中每个格子就是一个内存单元(假设用每个格子表示1字节,1格子=1字节内存 byte)。
那我的每条程序语句依次都做了什么呢?
int age = 25;
声明了一个int型变量,一个int型变量占用4字节,所以在内存空闲处分配4字节的内存,将值25
写入该段内存。
本次程序运行时,该段内存地址为0x16fdff218
int* p = &age;
声明了一个指针变量(用于存储内存地址值,所以指针变量一般都占8字节)
这个变量存储的值是什么呢?是之前的age
变量内存地址
。
至于本次的指针变量存放于内存的何处(内存地址),不重要,从值也是一个符合规范的随机位置。
printf("age = %d\n", age);
int型变量 age 的值是多少?25
printf("&age = %p\n", &age);
int型变量 age 的内存地址是多少?0x16fdff218
printf("p = %x\n", p);
打印指针变量 p 的值,就是为指针变量 p 分配的那8个字节里存储的值,也即变量 age 的内存地址。
printf("*p = %d\n", *p);
给你一个指针变量名,如何获取该指针变量指向的变量的值?*p