15-指针
15-指针
内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是 1 个字节。为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
【注】内存属于空间!!!
【举例】内存在使用和现实生活中的空间有很多相似的地方。现实生活中想找到一个地方,当描述xxx省xxx市xxx区xxx大学xx楼这样的地址就能精确的找到一个地方。对于内存也是一样的。内存是一个很大的空间。
一、内存的编号
【问】内存是怎么编号的?
【答】32 位机器,是指拥有 32 根地址线。而地址线是物理的线,物理的线可以通电,即通正电就是 1,通负电就是 0。此时将电信号转换成数字信号(1 和 0 组成的二进制序列),这些二进制序列的编号就被称为内存的地址。同样 64 位机器,也是一样。
二、内存单元的空间
【问】一个内存单元是多大空间?
【答】32 位机器,可以管理 232 个内存单元。假设一个内存单元是 1 bit,即总共可管理 232 bit = 4,294,967,296bit;4,294,967,296bit / 8 = 536,870,912Byte;536,870,912Byte / 1024 = 524,288KB;524,288KB / 1024 = 512MB;512MB / 1024 = 0.5GB。
【注】最终:一个内存单元是一个字节,然后分配地址的!!!
三、例程
【注】变量所占的字节在取地址时,是所占的字节的第一个地址!!!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在内存中要分配 4个字节 的空间 存放 10
printf("%p\n", &a); //%p是打印地址的格式
return 0;
}
四、指针变量
指针变量是用来存放地址的(存放的是别的变量地址)。
1、定义方式
[类型]* [变量1] = &[变量2]
2、&
取址符,用来获取 [变量2] 的地址。
3、指针变量
*说明 [变量1] 是指针变量。
4、类型
说明 [变量1] 执行的是 [变量2] 的 [类型]。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在内存中要分配 4个字节 的空间 存放 10
/*
* * 说明 pa 是指针变量
* int 说明 pa 执行的对象是 int 类型的
*/
int* pa = &a; //pa 是用来存放地址的,在 C语言 中 pa 叫指针变量
printf("%p\n", pa); //%p是打印地址的格式
char ch = 'w';
char* pc = &ch;
printf("%p\n", pc); //%p是打印地址的格式
return 0;
}
5、*
解引用操作符。
*[变量1] :通过 [变量1] 的地址找到 [变量2],并且获取或者改变 [变量2] 值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在内存中要分配 4个字节 的空间 存放 10
/*
* * 说明 pa 是指针变量
* int 说明 pa 执行的对象是 int 类型的
*/
int* pa = &a; //pa 是用来存放地址的,在 C语言 中 pa 叫指针变量
/*
* * 解引用操作符,*pa 就是通过 pa 里面的地址,找到 a
*/
*pa = 20;
printf("%d\n", a); //%p是打印地址的格式
return 0;
}
6、例程 & 解析
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在内存中要分配 4个字节 的空间 存放 10
/*
* * 说明 pa 是指针变量
* int 说明 pa 执行的对象是 int 类型的
*/
int* pa = &a; //pa 是用来存放地址的,在 C语言 中 pa 叫指针变量
*pa = 20;
printf("%d\n", a); //%p是打印地址的格式
return 0;
}
【注】指针就是地址!!!
五、指针变量的大小
指针是用来存储地址的,指针需要多大空间,取决于地址的存储需要多大空间。
32位机器 —— 32bit —— 4Byte
64位机器 —— 64bit —— 8Byte
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*)); // 8(字节)
printf("%d\n", sizeof(short*)); // 8(字节)
printf("%d\n", sizeof(int*)); // 8(字节)
printf("%d\n", sizeof(long*)); // 8(字节)
printf("%d\n", sizeof(long long*)); // 8(字节)
printf("%d\n", sizeof(float*)); // 8(字节)
printf("%d\n", sizeof(double*)); // 8(字节)
printf("%d\n", sizeof(long double*)); // 8(字节)
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构