C语言指针(上)

前言:

指针是C语言中最基础、最重要的概念之一,它使得C语言成为一门强大的、高效的、灵活的编程语言。 指针的存在使得C语言可以进行复杂的内存操作,能够更好地控制程序的行为,同时也能够实现高效的数据结构和算法。 指针是一个变量,它存储了一个内存地址,而这个内存地址指向的是另一个变量或对象的位置。

一. 指针的概念

指针本质上就是地址。

口语说的指针,其实是指针变量,指针变量就是一个变量,指针变量是用来存放地址的一个变量。

指针变量里边存放的是地址,而通过这个地址,就可以找到一个内存单元(内存划分了一个一个单元,而一个单元就是一个字节,其中内存单元的地址不是需要存起来的,因为它是由硬件生成的,硬件生成一个地址后直接去内存里面访问他这个编号所对应的内存单元)。

二. 内存单元地址的产生

(1)常见的内存单位及其换算:

bit byte kb mb gb... => 8bit = 1bite ,1024bite = 1kb,1024kb = mb, 1024mb = 1gb...  

(2)对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生的高电平(高电压)和低电平(低电压)就是(1和0)(产生高电压转化为数字信号就是1,产生低电压转化的数字信号就是0).

那么由0和1组成的不同排序方式就有2的32次方种,也就是说这里就有2的32次方个地址。

每个地址标识一个字节,那我们就可以给(2^32Byte == 2^32/1024KB == 2^32/1024/1024MB == 2^32/1024/1024/1024 == 4GB)4G的空间进行编址。

这里我们就明白:

在32位的机器上,地址是32个1和0组成的二进制序列,那地址就得用4个字节(存一个0或者1用一个比特位那么存32个1和0组成的序列就需要32个比特位也就是32/8 == 4个字节)的空间来储存,所以一个指针变量的大小就应该是4个字节。

 在64位的机器上,那一个指针变量的大小是8个字节,才能存放一个地址。

C语言指针(上)_第1张图片

 上图中的x86意味着32位的环境,x64则意味着64位的环境。

C语言指针(上)_第2张图片

C语言指针(上)_第3张图片

三. 指针和指针类型

1.指针类型不会决定指针变量所占内存的大小,而是决定了它被解引用操作的时候访问几个字节。 

举例:如果是int*的指针,解引用访问4个字节,如果是char*的指针,解引用访问1个字节。

        0x表示的是16进制的数字,而1个十六进制的数字需要4位二进制的数字表示,也就是需要4bit的空间进行存放,这时我们就可以知道一个bite位就可以存放两个十六进制的数字,所以下图中地址是两两存放数字的。

C语言指针(上)_第4张图片

        从下面这张图可以知道char*的指针是可以存放int*的指针的地址的,所以我们可以知道指针类型不会决定指针变量所占内存的大小。结合后面两张图来看char*的指针只改变了1个字节的数字,而int*的指针则可以改变4个字节的数字,说明了指针决定了被解引用操作的时候访问几个字节。

C语言指针(上)_第5张图片

C语言指针(上)_第6张图片

2.指针类型决定了加1(或减1)操作的时候跳过几个字节,决定了指针的步长。

C语言指针(上)_第7张图片  

从上图打印的地址我们可以知道int*的指针加一后跳过了4个字节,而char*的指针加以后跳过了1个字节。

3.指针类型的混用

指针类型是不能混用的,因为不同类型的指针对内存的解读方式是有所差异的。

例如,虽然int*与float*解引用访问的空间大小一样,但是float是按照浮点数的方式进行存储的,int是按照整数的方式进行存储的 。

你可能感兴趣的:(c语言,c语言,开发语言,算法)