内存
要理解指针,首先要清楚什么是内存是计算机中用于临时存储数据和指令的高速组件,它允许CPU快速存取当前运行程序所需的信息。内存的特点是读写速度快,但断电后数据会丢失。它是计算机运行程序和处理数据的关键部件。
电脑的内存是8G/16G/32G/等,那这些内存空间如何高效的管理呢?
其实也是把内存划分一个个的内存单元,每个内存单元大小取一个字节
- 计算机中常见的单位:
bit
Byte = 8bit
KB = 1024Byte
MB = 1024MB
GB
TB
PB
一个比特位可以储存一个2进制的位1或者0所以一个字节(一个内存单元)可以储存256种状态
而要想精准的访问内存单元就需要其所对应的编号,(就像现实生活中每栋大楼里面的房间都有对应的房间号)内存的编号也就是我们说的地址。在C语言中给地址起的名字就是指针
也就是说:内存编号 = 地址 = 指针
指针变量
&取地址操作符
理解了内存的概念,那么我要怎么获得地址呢,在C语言中我们有&取地址操作符可以用来获取地址
int a=10;
&a
这就取出了变量a的地址了
当取出地址后我们需要一个‘容器’来存放取出来的地址,这个时候我们就需要指针变量的出现了
指针变量和* 接引用操作符
int a = 10;
int *p = &a;
这里的int* p就是指针变量( * )表示是指针变量而(int)表示变量p指向的内容是int类型的变量。
那么怎么使用( * )解引用操作符呢
int a = 10;
int *p = &a;
*p=20;
printf("%d",a);//这个时候打印出来的并不是10,而是20
printf("%d",*p)//这个打印出来的结果跟上面相同
( * )解引用操作符顾名思义,是把存储的地址解放出来,如果改变解放出来的值,那么对应的变量的值也会发生改变。
因为变量的实质是在内存中创建一块空间,而这块空间的编号就是地址,那么指针变量找到获取这个地址,并且改变这个地址空间的值,就是改变的变量实际的值。
因此指针是C语言中一个强大的工具
指针变量类型的意义
变量有很多类型,包括char int flaot等等
那么指针变量指向的不同类型有什么区别吗
printf("%zd",sizeof(char*));
printf("%zd",sizeof(int*));
printf("%zd",sizeof(float*));
printf("%zd",sizeof(double*));
最后你得到的结果相同
X86 X64
4 8
4 8
4 8
4 8
这是因为指针储存的是内存地址,而地址的大小的固定的,与它指向的类型无关。类型仅仅表明访问时,应如何解读储存的地址
#include <stdio.h>
int main() {
int num = 0x12345678; // 4字节的int,十六进制值
char* p_char = (char*)# // 强制转为char*类型指针
int* p_int = # // int*类型指针
// 按char*解析:一次读1字节(小端存储下,先读低地址的0x78)
printf("char*解析: 0x%x\n", *p_char); // 输出0x78
// 按int*解析:一次读4字节,完整读取0x12345678
printf("int*解析: 0x%x\n", *p_int); // 输出0x12345678
return 0;
}
这里要注意的是有一种特殊的指针类型**void**** 是无具体类型的指针,这种类型的指针可以用来接受任意类型的地址。但那也是有局限性的,void * 不能直接进行任何操作,包括指针的±整数,和解引用的运算
指针运算
有三种
- 指针±整数
- 指针-指针
- 指针的关系运算
int arr[5] = {10,20,30,40,50};
int *p1 = &arr[1]; // 指向20
int *p2 = &arr[3]; // 指向40
// 1. 指针±整数
printf("%d", *(p1 + 2)); // 输出40(p1地址+2个int跨度→指向arr[3])
// 2. 指针-指针
printf("%td", p2 - p1); // 输出2(间隔2个int元素)
// 3. 指针关系运算
if(p1 < p2) // 比较地址值
printf("p1在低地址");
&spm=1001.2101.3001.5002&articleId=156991931&d=1&t=3&u=abb77f5ae1af44918bc877635ecd9e95)
278

被折叠的 条评论
为什么被折叠?



