当前位置: 首页 > news >正文

【C语言】指针基础知识(一)

af3be47e1d3f4ecb9d2eddbe236b0e45.png

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。

一,内存和地址

内存被分为一个个单元,一个内存单元的大小是一个字节。

内存单元的编号(可以理解为门牌号) == 地址 == 指针
编址:如何找内存空间(找门牌号)

56ed76c333844401a7371cc18765d943.png

控制总线:发信息———要读取目标信息

地址总线:拿信息———拿取到目标信息

数据总线:传信息———从内存向CPU传信息

二,指针变量和地址

1,简单理解:

int main()
{
    int a = 0;

    return 0;
}

表层意思:创建一个变量a,并赋值为10。

深层意思:在内存上申请4个内存的空间,存放10。

2,取地址:

int main()
{
    int a = 10;
    printf("%p", &a);

    return 0;
}

运行结果:

d0104b6abd5d4abcb0346306f04667a6.png

一个整型的大小为四个字节,每个字节都有它所对应的地址。但是打印整型地址时并不是四个字节都打印,而是只打印四个地址里的第一个地址(地址较小的那个)。

3,指针变量:

地址可以用指针变量存放起来。也就是说,指针可以用指针变量存放起来。
int *pa=&a;
pa为指针变量,int*为变量的类型。
注意!!!我们口头所说的指针一般是指针变量。
通过地址可以找到a,也可以说是pa指向了a的起始位置。
2321b7afe3d948d895325f5b92b3a277.png
int*中的int和*分别代表什么?
*      说明pa是指针变量的意思
int    说明pa指向的对象的类型是int类型

4,解引用操作符

地址有了,该怎么用?也就是说,有了变量(pa),该怎么用?

这样用:

int main()
{
    int a = 10;
    printf("%p\n", &a);
    int* pa = &a;
    *pa = 20;

    return 0;
}

*pa为解引用操作符,意思是:通过pa里面的地址找到它所指向的值,也就是a。也就是说,*pa就是a。

代码中*pa=20的意思就是a=20。

5,指针变量的大小

指针变量是专门来存放地址的,无论是什么,只要在指针变量里,它都是地址。

指针变量的大小有多大?取决于一个地址的存放需要多大的空间。

验证:

#include<stdio.h>
int main()
{
    char* a = NULL;
    int*  b = NULL;
    printf("%zd\n", sizeof(a));
    printf("%zd\n", sizeof(b));
    return 0;
}

运行结果:

29a2e3e52f59450bb81406d2632bf5b0.png

注:X86是32位机器,X64是64位机器

 

32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台下,大小都是相同的。
注:不同环境会带来不同的影响,例如:指针变量大小的区别

 

 

相关文章:

  • Excel使用VLOOKUP函数
  • C# 使用OpenCvSharp4将Bitmap合成为MP4视频的环境
  • Android和IOS Flutter应用开发使用 Provider.of 时,可以使用 listen: false 来避免不必要的重建
  • 算法---二分查找练习-2(寻找旋转排序数组中的最小值)
  • 稀碎从零算法笔记Day22-LeetCode:
  • 【类脑智能】脑网络通信模型分类及量化指标(附思维导图)
  • Spark-Scala语言实战(3)
  • Spring Boot:筑基
  • 【滑动窗口】长度最小的子数组|无重复字符的最长子串|最大连续1的个数 III|将 x 减到 0 的最小操作数
  • EPSON XV4001BC陀螺仪传感器汽车导航系统的应用
  • LabVIEW NV色心频率扫描
  • C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码
  • 热插拔技术详解(中)
  • Python分析无人驾驶汽车在桂林市文旅行业推广的问卷
  • Java基础-IO流
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • avalon2.2的VM生成过程
  • JavaScript服务器推送技术之 WebSocket
  • JS字符串转数字方法总结
  • Redis 懒删除(lazy free)简史
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从0到1:PostCSS 插件开发最佳实践
  • 今年的LC3大会没了?
  • 前端知识点整理(待续)
  • 软件开发学习的5大技巧,你知道吗?
  • 通信类
  • 小程序button引导用户授权
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​Spring Boot 分片上传文件
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (3)(3.5) 遥测无线电区域条例
  • (SpringBoot)第二章:Spring创建和使用
  • (十)T检验-第一部分
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转) Android中ViewStub组件使用
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET中GET与SET的用法
  • :=
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Not - Empty-Null-Blank
  • @RestController注解的使用
  • @Tag和@Operation标签失效问题。SpringDoc 2.2.0(OpenApi 3)和Spring Boot 3.1.1集成
  • [【JSON2WEB】 13 基于REST2SQL 和 Amis 的 SQL 查询分析器
  • [20170713] 无法访问SQL Server
  • [Android Pro] Notification的使用
  • [C++] 默认构造函数、参数化构造函数、拷贝构造函数、移动构造函数及其使用案例
  • [CareerCup] 14.5 Object Reflection 对象反射