详解指针(初阶)

简介: 详解指针(初阶)

什么是指针

在C语言中,指针就是变量, 数组,函数在内存中分配的地址。我们口头说的指针其实指的是指针变量。CPU与内存之间连着地址线,有的是32根地址线,有的是64根。这些地址线会产生正电或负电。这些电信号就可以转化为数字信号,及正电为1,负电为0。这样我们就可以用二进制为内存编码。这些编码就是内存的地址,而这些地址就是指针变量。这里值得注意的是并不是一块内存对应一个不变的地址(编号),内存本身只是一块空间,这块空间并没有编号,只是编译器在分配内存的时候赋予该空间编号。一个编号对应一个字节的的大小。

我们知道编译器为一个int类型的变量开辟的空间占4个字节。那如果要把一个地址存放到指针变量中,需要为指针变量开辟多大的空间呢?我们可以从地址线分析,假设是32根地址线,一个编号就有32个0或1,1个0或1占一个比特位,8个比特位占1字节,32个比特位占4个字节。也就是说在32位环境下指针变量的大小为4个字节,同理,64位下为8个字节。


理解指针

int a = 0;
int * p = &a;

知道了指针的定义,我们要如何理解上述代码呢?

首先,编译器为a开辟了一块4个字节大小的空间并且初始化为0,编译器自然会给这块空间进行编号,假设为0x005afd58,那么a的地址为0x005afd58。然后我定义了一个p变量,p旁边的  * ,说明该变量是一个指针变量。而  *  旁边的int说明p指向的对象为整形,取出a的地址(0x005afd58)赋给指针变量p。


接下来我要重点说一下  *  旁边的 int,请看如下代码

int a = 0;
int * p1 = &a;
char * p2 = &a;


我刚才说  *  旁边的类型,表示指针所指向对象的类型。其实它有两个作用,1,一次性访问指针所指向的对象的权限(大小)。2,指针加减整数所跳跃的大小

先说1,因为a的地址是4个字节,而我p1的  *  的旁边是int类型,所以我一次性能够访问的大小为4个字节,刚好能访问a的全部内容。同理,我p2的  *  的旁边是char类型, 所以我只能访问a的一个字节的内容。

其次是第2个作用,这个比较好理解,比如“  p2  +  2  ”, 表示p2从起始位置往后跳过  一个字节乘以二。

如果上述内容对你有帮助的话,能不能给个赞呢(手动狗头)

相关文章
|
开发框架 JavaScript 前端开发
在Vue前端界面中,几种数据表格的展示处理,以及表格编辑录入处理操作。
在Vue前端界面中,几种数据表格的展示处理,以及表格编辑录入处理操作。
|
Linux Docker 容器
Linux环境下Docker的卸载
本文可以满足完整卸载Docker的需求。文章记录了在Linux环境下Docker的卸载过程,包括Docker软件包、镜像、容器、数据卷等文件的删除。
16412 39
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
530 1
|
编解码 开发工具 块存储
华为海思HI3518E方案视频编解码传输项目
华为海思HI3518E方案视频编解码传输项目
396 0
|
缓存 安全 Cloud Native
10个Bug环环相扣,你能解开几个?
由阿里云云效主办的2021年第3届83行代码挑战赛已经收官。超2万人围观,近4000人参赛,85个团队组团来战。大赛采用游戏闯关玩儿法,融合元宇宙科幻和剧本杀元素,让一众开发者玩得不亦乐乎。
4062 0
10个Bug环环相扣,你能解开几个?
|
开发工具 Android开发 C语言
Qt编写自定义控件12-进度仪表盘
一、前言 进度仪表盘主要应用场景是标识一个任务进度完成的状况等,可以自由的设置范围值和当前值,为了美观还提供了四种指示器(圆形指示器/指针指示器/圆角指针指示器/三角形指示器),各种颜色都可以设置,其中的动画效果采用的QPropertyAnimation类来实现,主要是线性插值法,生成一定规则的数值,用于设定的属性。
1421 0
人工智能 缓存 前端开发
12022 63
人工智能 JavaScript 开发工具
4805 17

热门文章

最新文章