C语言的指针(1)
指针的由来
内存地址的定义
类似去快递点取快递,需要地址和取件码并得到快递员的确认才可以拿到需要的物品,当想要在内存中拿到你想要的变量值时,便需要得到存放此变量的**内存地址**;
那么何为内存地址?
抽象化的可以理解为:内存按照大小可以划分为一个又一个的单元格,对,就像Excel里的单元格一样,他们大小相同,按照顺序排列,(老师是这里抽象化的)32位系统的一个内存单元为4字节,64位系统的单元内存8字节;
就在这样的“单元楼”内,存在着32跟地址线,(这里以32位系统为例),以其正电负电的状态表示二进制的0,1组合。那么32跟地址线便存在
0000 0000 0000 0000 0000 0000 0000 0000
| | | | | | | |
1111 1111 1111 1111 1111 1111 1111 1111
共2的32次方种组合
同理,每一个内存单元便用这2的32次方中的一员来表示其地址。
后来为了方便表示 内存地址均用16进制来表示:
0x0000~0xFFFF 来表示其内存范围;
怎样对变量进行取用
当我们定义一个整型变量时, 系统便会为我们开辟一个4字节的空间用来存储这个变量,由上文可知,这个字节存贮的内存单元有其地址所在,当我们想要再次访问存在这个地址变量时,就有两种途径:
1.通过定义时的名字来取出其值;
int a = 0;
2.通过存放其值的地址编号来找到这个值,进而取用它;
这就是用到了指针------可以叫它存放地址的变量
指针变量的使用
存放内存地址的变量成为指针变量,其形式见下面代码
#include<stdio.h>
int main(){
int a = 5;
int* pa = &a;
printf("%d",a);
printf("%p",&a);
printf("%p",pa);
printf("%d",*pa);
return 0;
}
这里可以看到的是 a的值和 通过地址找过去(解引用 *pa)的值 一致!
a的地址和pa指针中存的地址 一致!
指针变量的书写格式:
存放变量的类型* (空格) 指针变量名 = (&变量名);
可以看到内存地址取得是小地址 ,且连续排列的
图中 int a 占四个字节 但其地址为初始的小地址作为其地址编号:
05 00 00 00 对应地址 0x0057FA60
61 62 63 64 下一个地址对应着 0x0057FA65
可证:地址连续
所有的32位系统其指针类型大小都是4字节
#include<stdio.h>
int main() {
printf("%p \n", sizeof(int*));
printf("%p \n", sizeof(char*));
printf("%p \n", sizeof(double*));
printf("%p \n", sizeof(float*));
return 0;
}