「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战」
写在前面
本篇博客,博主带你从入门到掌握指针,C语言指针并没有那么难,认真看完,你一定有所收获,建议收藏。
@TOC
指针初识
C语言系列1我们已经介绍过了指针一些相关的概念,我们再来复习一下。
基本概念
指针是什么?
在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
通俗点讲指针就是一个变量,指针变量存储了地址(内存单元编号)。通过这个地址(编号)就可以找到该内存空间进行访问。
内存
内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。 所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。 为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该内存单元的地址。
int a创建了一个4字节的内存,而我们根据第一个字节的地址编号就可以找到a的4个字节。
所以a的地址就是第一个字节的地址编号。
而地址编号又是怎么来的呢?
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的是产生一个电信号正电/负电(1或者0)
那么32根地址线产生的地址就会是:
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
...
11111111 11111111 11111111 11111111
这里有2^32个地址,每个地址又对应一个存储单元。
2^32bit=2^32/2^10kB....=4GB所以我们可以知道,32根地址线可以为内存4 G大小的编址,64位机器同理。
我们说了指针也是一个变量,变量就要有空间存储,所以指针需要多大内存空间存储呢?
32根地址线,能组成一串32位二进制字符串,1位二进制为1bit所以地址大小为4byte.。 64位机器地址大小就是8byte。
总结
32位平台,指针大小为4byte64位平台,指针大小为8byte
指针及其类型
我们知道变量都有类型,指针变量也不列外。
int a=2;
int* pa=&a; //int 类型的指针变量pa。
我们刚刚说过,指针大小在不同平台下为4/8byte
就是说不同类型指针大小也相同?
32位平台
64位平台
可以看到,确实如此,不同平台不同类型的指针大小相同。
那指针的类型有什么意义嘛?
两个不同类型的指针(地址)相同。
我们知道
int*pa=&a;int有4个字节,而地址就是第一个字节地址编号,所以char*pc也存储了int a的第一个字节编号,所以两个地址相同
指针的解引用
int *pa=&a; *pa=1;
char *pc=&a; *pa=1;
我们可以清楚的看到
初始化
int a=0x0012ff33;(0x表示16进制的数据)
int *pa=&a; *pa=1; : a=0x00000001;
char* pc=&a; *pc=1;: a=0x00 f f 1201;
*pc只能对int a一个字节解引用,访问一个字节。
总结:
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。比如:
char*的指针解引用就只能访问一个字节,而int*的指针的解引用就能访问四个字节。