C语言指针,楼下大爷都能学会的小细节1(和bug郭一起学C系列)

147 阅读4分钟

「这是我参与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位平台,指针大小为4byte 64位平台,指针大小为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*的指针的解引用就能访问四个字节。