目录
1.指针是什么?
2.如何取地址?
——取地址操作符(&)
——指针变量和解引用操作符(*)
<指针变量>
<如何拆解指针类型>
<解引用操作符*>
——指针变量的大小
3.指针变量类型的意义
——指针的解引用
——指针+-整数
1.指针是什么?
在讲解指针之前,我们先来认识下内存。我们都知道,CPU在处理数据时,是从内存中读取数据,处理完数据后放回内存中。内存的管理机制是将内存划分为一个个内存单元,一个内存单元为1个字节。其中一个字节为8个比特位,详细单位换算如下图:
单位换算
1Byte=8bit1KB=1024Byte1MB=1024KB1GB=1024MB1TB=1024GB1PB=1024TB
可以这么来形容:内存单元就相当于地址,CPU需要访问内存时便将地址传给CPU来处理数据。在C语言中我们将这个地址称为指针。所以我们可以这样理解:地址==指针
CPU与内存之间有三根线:地址总线、数据总线、控制总线
CPU访问内存中的某个地址空间,必须知道这个字节空间在内存中的什么位置,而因为内存中字节很多,所以需要给内存进行编址。
硬件之间需要互相协同工作,但是硬件之间又是互相独立的,这时我们就需要用一根“线”连起来。而CPU和内存之间也是有大量的数据交互的,所以两者必须也用线连接起来。
接下来我们先讲解一下地址总线。在计算机中,32位机器就有32根地址总线,每根线只有两态,表示0和1.。那么一根线就能表示2种含义,2根线就能表示4种含义,以此类推,32根地址总线,就能表示种含义,每一种含义都代表一个地址。
地址信息被下达给内存,在内存上,就可以找到改地址对应的数据了,将数据再通过数据总线传入给CPU内寄存器。
2.如何取地址?
——取地址操作符(&)
在c语言中,创建变量相当于向内存申请空间。例如我们创建一个整型变量a,在内存中会申请4个字节。假设这四个字节地址分别是:0x006FFD70、0x006FFD71、0x006FFD72、0x006FFD74.
我们如何取到a的地址呢?这里就要认识一下这个操作符:取地址操作符(&)。&a取出的是a所占的4个字节中地址较小的字节的地址,所以在以下代码中,他会输出:0x006FFD70。
#include
int main()
{
int a=10;
&a;
printf("%p\n",&a);
return 0;
}
——指针变量和解引用操作符(*)
<指针变量>
我们通过取地址操作符(&)拿到的地址是一个数值,比如:0x006FFD70,这个数值有时候也需要存起来,方便后期使用。我们该如何存这个地址值呢?将它存入指针变量中。
例如:
#include
int main()
{
int a=10;
int *ptr=&a;
return 0;
}
这里就是将a的地址赋予给ptr,在ptr中存储。像这样存放在指针变量的值都会理解为地址
<如何拆解指针类型>
例如以下代码
int a=10;
int *ptr=&a;
在这个代码中ptr前面加上了*,是int*类型,*是在说明ptr是指针变量,而前面的int是在说明ptr指向的是整型类型的变量。(int)
<解引用操作符*>
我们将地址保存起来,以后还是要用的,那如何用呢?在c语言中,我们只要拿到了地址(指针),就可以通过地址(指针)来找到相应的对象。在这里我们就要学习解引用操作符(*)。
#include
int main()
{
int a=100;
int *ptr=&a;
*ptr=10;
return 0;
}
*ptr的意思是将a的地址赋予给ptr,而*ptr就是a中的数值。所以后面我们将*ptr修改为10,a的值也会随之改变为10.
——指针变量的大小
在32位系统中,内存中有32根地址总线;同理在64位系统中,内存中有64根地址总线。所以在32位系统中指针的大小为4个字节,64位系统中大小为8个字节。
不管是int*、short*、double*还是char*,指针大小都为4或8.
·注意指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的
3.指针变量类型的意义
上面我们已经学习到,指针变量在同一个系统下,不管它的类型是什么,占用的大小都是一样的,那为什么还有各种各样的指针变量呢?
——指针的解引用
我们给出两个代码为例:
//text1
#include
int main()
{
int a=0x11000011;
int *ptr=&a;
*ptr=0;
return 0;
}
//text2
#include
int main()
{
int a=0x11000011;
char *ptr=(char *)&a;
*ptr=0;
return 0;
}
在这里text1会将a的4个字节全部改成0,而text2仅会将a的1个字节改成0。这便是两者的区别。
·指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。
——指针+-整数
#include
int main()
{
int a = 10;
char *ptr1 = (char*)&a;
int* ptr2 = &a;
printf("%p\n",&a);
printf("%p\n",ptr1);
printf("%p\n",ptr1+1);
printf("%p\n",ptr2);
printf("%p\n",ptr2+1);
return 0;
}
代码运行的结果如上图所示。
char*类型的指针变量+1跳过一个字节,int*类型的指针变量+1跳过了4个字节。
故指针的类型决定了指针向前或者向后走一步有多大的距离。
未完待续......