初学者如何理解C语言中的指针——C指针

想要成为一名优秀的 C 程序员,学会指针是很有必要的!那么什么是指针呢?在C语言中应该怎么正确使用指针呢?我们一步一步来学习C指针。

什么是指针?

“什么是指针?”, 搞清楚指针的概念是学会指针的第一步。

指针是数据,变量的指针就是变量的地址。那什么是地址?
地址是内存的编号。那什么是内存?
内存是抽象出来给程序员使用的虚拟存储器,而不是真实存在的物理储存器。所以这里的内存是在逻辑上存在的。

想学会指针光知道这些是远远不够的,但是离学会指针又进了一步不是吗?继续学习吧…


一、内存和地址

这里的内存是从逻辑上来讲的,是经过抽象而来的,是一个新的概念。程序员眼中的内存应该是这样的:
在这里插入图片描述
可见内存是很多个内存单元(字节)组成的,逻辑上可以是无限多个,但实际上是有限制的,内存x1024x1024的结果就是最大值了。
而每一个内存单元都有一个唯一且固定的编号——内存地址,换句话说,每个内存地址能且只能确定一个内存单元。给内存单元编号是为了便于管理。
注意: 在计算机中内存地址都是二进制的,而程序打印出来的是十六进制(二进制太长,也不方便阅读)。
内存单元的大小单位:

1 bit
字节 8 bit
32 bit(通常)

为了便于理解,我们把内存想象成一列很长很长的火车,然后从第一节依次往后编号(内存地址)为“0, 1, 2, 3, 4, 5 … …”,如何才能准确找到目标车厢?——用编号!

这一部分内容让我们知道内存是怎么有序管理的,其实就是用内存地址来给各个内存单元编号。使用内存就应该遵循它的规则——用内存地址(指针就地址哦)
接下来我们来看内存是怎么存的。

二、内存和变量

简单提一下:
变量分为全局变量、局部变量和静态变量。
内存又分四区:代码区、静态区、栈区和堆区。

扯远了…
我们常用的计算机采用的是二进制,只有 “0” 和 “1”,所以内存中存储的数据是变量对应的二进制数。一个 “0” 或 “1” 占用 1 bit 空间,而一个字节是 8 bit,明显不够用,比如一个int占四个字节,表示-2^31 + 2^31之间(第一位符号位)。所以int在内存中是占用了4个连续字节的。

举例,最常用的 int、double、char类型:

#include

int main()
{
    int l0, l1, l2;
    double a = 0;
    int b = 1;
    char c = 'c';
    l0 = sizeof(a);
    l1 = sizeof(b);
    l2 = sizeof(c);
    printf("double:%d\n",l0);
    printf("int:%d\n",l1);
    printf("char:%d\n",l2);
    return 0;
}

初学者如何理解C语言中的指针——C指针_第1张图片
所以存储一个int类型变量要占4个连续字节,例如(1001~1004)
再次说明,不同的变量类型所占的字节数可能不同,所以内存为变量分配的空间也不同。为什么要说到变量,因为指针变量也是变量! 具有和变量相同的特征。

三、再看指针

指针就是地址本身(变量的指针就是变量的地址),指针变量是用来存放地址的变量(指针变量就是地址变量),指针变量的值是一个地址。地址就是地址,地址本身就是一个值。对指针变量来说,把谁的地址放在指针变量中,指针变量就指向谁。
注意: 只有与指针变量的基类型相同的数据的地址才能放在相应的指针变量中。

先写到这里… …有错误或不足之处请评论,谢谢大家!

你可能感兴趣的:(初学者如何理解C语言中的指针——C指针)