前言:这篇文章将全方面带你了解指针的作用。
1.内存和地址
1.1内存
计算机cpu在处理数据时,在内存读取数据,处理后的数据再放回内存。
把内存划分为一个个内存单元,每个内存单元大小为一个字节。
补充:一个字节有8个比特位,比特位是存储二进制的0或1。
每一个内存单元都有一个编号,有了这个编号cpu可以快速找到一个内存空间。
c语言中将编号称作指针,因此我们可以理解为: 内存单元编号==地址==指针。
1.2如何理解编址
首先必须理解,计算机内有很多硬件单元,硬件单元之间是相互合作的,至少相互之间要能够相互之间进行数据传递。
但是硬件间相互独立,是如何实现联系的呢?
答案很简单,用“线”连接起来。
而cpu和内存之间有大量数据交互,所以,两者也需要用线连接。

cpu在内存中访问空间,必须知道空间的位置,因此对字节空间进行编址。
计算机编址并不是把每个字节地址记录下来,而是通过硬件设计完成。
我们可以简单理解,32位的机器中,cpu和内存间存在32根地址总线,每根线有0和1两种状态,因此32根就可以表示2^32种地址。
例如:地址信息通过地址总线,可以在内存中找到地址对应的数据,再通过地址总线将数据传入cpu内寄存器。
2.指针变量和地址
2.1取地址操作符(&)
理解地址和内存关系,我们再回到c语言中,c语言中创建变量就是在向内存申请空间,比如:
其中&为取地址操作符,我们发现变量a有四个字节,其中内存中44的地址和变量a的地址相同,那是因为变量的地址取自最小的字节编号。

因此我们只要知道第一个字节地址,就能访问4个字节的数据。
2.2解引用操作符(*)
#include<stdio.h>
int main()
{
int a=10;
int*pa=a;
return 0;
}
在这个代码中pa的类型是int*,其中*说明pa是指针变量,而int说明pa指向的对象是整形(int)。
#include<stdio.h>
int main()
{
int a=10;
int*pa=a;
*pa=20;
printf("a=%d",a);
return 0;
}
在这个代码中*pa,pa指向的是a的地址,而*pa表示解引用a的地址,*pa等价于a。
a=20
2.3指针变量的大小
指针变量是专门存放地址的。而指针变量的大小取决于机器,在32位的平台上,指针大小为32比特位,也就是4字节,同理64位平台上指针大小是8字节。
注意指针变量大小与类型无关,只与平台有关。
3.指针变量类型的意义
指针变量大小和类型无关,那么我们为什么还要有各种各样的指针类型呢?
3.1指针的解引用

根据代码我们发现pa类型为int*,对*pa赋值为0,int a的每个字节都变成00;

当pa类型为char*时,对*pa进行赋值,只改变了int a的第一个字节内容。
结论 :指针类型决定了,对指针解引用时有多大的访问权限。
比如:char*类型解引用时每次只能访问一个字节,而int*可以访问4个字节。
3.2指针+-整数
#include<

最低0.47元/天 解锁文章
3454

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



