96SEO 2026-02-20 08:29 27
等那这些内存空间如何高效的管理呢其实也是把内存划分为⼀个个的内存单元每个内存单元的大小取1个字节。

在这里稍微补充一下一个比特位(bit)可以存储⼀个2进制的位1或者08个比特位构成一个字节。
每个内存单元也都有一个编号这个编号就相当于宿舍房间的门牌号有了这个内存单元的编号CPU就可以快速找到⼀个内存空间。
生活中我们把门牌号也叫地址在计算机中我们把内存单元的编号也称为地址。
C语言中给地址起了新的名字叫指针。
理解编址CPU访问内存中的某个字节空间必须知道这个字节空间在内存的什么位置这就需要我们刚才所说的指针了。
在计算机中的编址并不是把每个字节的地址记录下来而是通过硬件设计完成的。
硬件与硬件之间是互相独立的那么如何通信呢答案很简单用线连起来。
而CPU和内存之间也是有大量的数据交互的所以两者必须也用线连起来。
不过我们今天关心一组线叫做地址总线。
硬件编址也是如此我们可以简单理解32位机器有32根地址总线每根线只有两态表示10【电脉冲有无】那么一根线就能表示2种含义2根线就能表示4种含义依次类推。
32根地址线就能表示2^32种含义每⼀种含义都代表一个地址。
地址信息被下达给内存在内存上就可以找到该地址对应的数据将数据在通过数据总线传入CPU内的寄存器。
我们使用C语言创建变量时其实是在向内存申请空间。
在这里我们向内存申请4个字节(整型)的空间用来存放1这个数值。
这4个字节每个字节都有编号(地址)。
变量的名字仅仅是给程序员看的编译器不看名字编译器是通过地址找内存单元的。
那我们如何能得到a的地址呢我们可以使用一个操作符()-取地址操作符。
这样我们就可以将a的地址取出来了。
当然a取出的是a所占4个字节中地址较小的字节的地址。
不过没关系知道了第一个地址也可以顺藤摸瓜地知道另外几个地址了。
我们先来看什么是指针变量那我们通过取地址操作符()拿到的地址是⼀个数值比如0x006FFD70这个数值有时候也是需要存储起来方便后期再使用的那我们把这样的地址值存放在哪里呢答案是指针变量中。
指针变量也是⼀种变量这种变量就是用来存放地址的存放在指针变量中的值都会理解为地址。
在上面的代码中int
*是该指针变量的类型int表示的是该指针指向的对象是整型类型的而*表示这个变量为指针变量。
接下来我们来看解引用操作符。
我们只要拿到了地址指针就可以通过地址指针找到地址指针指向的对象。
这里就需要用到我们刚才说的解引用操作符(*)。
的意思就是通过pa中存放的地址找到指向的空间*pa其实就是a变量了所以*pa
0这个表达式就是把a改成了0。
有人会想这里如果目的就是把a改成0的话写成
其实这里是把a的修改交给了pa来操作这样对a的修改就多了一种的途径写代码就会更加灵活后期慢慢就能理解了。
在前面我们了解到32位机器假设有32根地址总线每根地址线出来的电信号转换成数字信号后是1或者0那我们把32根地址线产生的2进制序列当做⼀个地址那么⼀个地址就是32个bit位需要4
如果指针变量是用来存放地址的那么指针变的大小就得是4个字节的空间才可以。
同理64位机器假设有64根地址线一个地址就是64个二进制位组成的⼆进制序列存储起来就需要
根据我们在上面得出的结论上图的代码在两种环境中得出的结果就不相同。
指针变量的大小和类型无关只要是指针变量在同一个平台下大小都是⼀样的为什么还要有各种各样的指针类型呢我们接下来慢慢分析。
通过调试我们可以看到代码2会将n的4个字节全部改为0但是代码1只是将n的第一个字节改为0。
结论指针的类型决定了对指针解引用的时候有多大的权限一次能操作几个字节。
这就是指针变量的类型差异带来的变化。
指针1其实跳过1个指针指向的元素。
指针可以1那也可以-1。
类型的可以理解为无具体类型的指针或者叫泛型指针这种类型的指针可以用来接受任意类型地址。
但是也有局限性
上图将该指针变量的类型本应该是int*却使用了char*。
所以下面就会报错误——类型不匹配。
我们如果使用void*就不会出现这种情况。
变量是可以修改的如果把变量的地址交给⼀个指针变量通过指针变量的也可以修改这个变量。
但是如果我们希望⼀个变量加上⼀些限制不能被修改怎么做呢这就是const的作用。
上述代码中n是不能被修改的其实n本质是变量只不过被const修饰后在语法上加了限制只要我们在代码中对n进行修改就不符合语法规则就报错致使没法直接修改n。
前面已经学习了指针所以如果我们绕过n使用n的地址去修改n就能做到了虽然这样做是在打破语法规则。
我们可以看到这里一个确实修改了但是我们还是要思考⼀下为什么n要被const修饰呢就是为了不能被修改如果p拿到n的地址就能修改n这样就打破了const的限制这是不合理的所以应该让p拿到n的地址也不能修改n那接下来怎么做呢
一般来讲const修饰指针变量可以放在*的左边也可以放在*的右边意义是不一样的。
当我们将const修饰指针变量放在*左边时*pn就不能被改变了。
当我们将const修饰指针变量放在*右边时pn就不能被改变了。
当我们将const修饰指针变量放在*两边边时*pn和pn就都不能被改变了。
所以总的来说const如果放在*的左边修饰的是指针指向的内容保证指针指向的内容不能通过指针来改变。
但是指针变量本⾝的内容可变。
const如果放在*的右边修饰的是指针变量本⾝保证了指针变量的内容不能修改但是指针指向的内容可以通过指针改变。
整数其实我们在前面已经说起过了。
因为数组在内存中是连续存放的只要知道第⼀个元素的地址顺藤摸瓜就能找到后面的所有元素。
在上述代码中我们就使用了指针-指针实现了strlen函数的效果。
野指针就是指针指向的位置是不可知的随机的、不正确的、没有明确限制的。
如果明确知道指针指向哪里就直接赋值地址如果不知道指针应该指向哪里可以给指针赋值NULL。
NULL
是C语言中定义的⼀个标识符常量值是00也是地址这个地址是无法使用的读写该地址会报错。
⼀个程序向内存申请了哪些空间通过指针也就只能访问哪些空间不能超出范围访问超出了就是越界访问。
当指针变量指向⼀块区域的时候我们可以通过指针访问该区域后期不再使用这个指针访问空间的时候我们可以把该指针置为NULL。
因为约定俗成的⼀个规则就是只要是NULL指针就不去访问同时使用指针之前可以判断指针是否为NULL。
arr[3];//重新让p获得地址//下次使⽤的时候判断p不为NULL的时候再使⽤if
用于在运行时确保程序符合指定条件如果不符合就报错终止运行。
这个宏常常被称为“断言”。
程序继续运用否则就会终止运行并且给出报错信息提示。
assert()
中写入一条错误信息显示没有通过的表达式以及包含这个表达式的文件名和行号。
有几个好处它不仅能自动标识文件和出问题的行号还有⼀种无需更改代码就能开启或关闭
的缺点是因为引⼊了额外的检查增加了程序的运用时间。
一般我们可以在
版本中直接就是优化掉了。
这样在debug版本写有利于程序员排查问题在
上面的调用就是传值调用我们可以看出用这个方法交换数值很明显是错的因为实参传递给形参的时候形参会单独创建⼀份临时空间来接收实参对形参的修改不影响实参。
那我们通过地址间接的操作main函数中的a和b并达到交换的效果就好了。
我们将是a,b的地址作为实参传递给test函数再通过解引用操作符的作用我们可以将a,b所对应的数值进行交换。
这种调用就叫传址调用。
传址调用可以让函数和主调函数之间建立真正的联系在函数内部可以修改主调函数中的变量所以未来函数中只是需要主调函数中的变量值来实现计算就可以采用传值调用。
如果函数内部要修改主调函数中的变量的值就需要传址调用。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback