概述:
本文章主要介绍C语言中指针最基础和核心的知识点。
内存:
在学习指针之前,让我们先了解内存空间、内存是如何编号、以及内存单元的大小。
内存空间:
内存空间的分配类似于日常生活中对空间的管理。我国国土面积960万平方公里,为加强对各个地区的管理,设立了省、市、区等行政单元。内存空间亦是如此。在计算机中,内存分布就像一个个小格子一样。每个小格子都有编号统称为内存编号。
内存编号:
我们日常购买的计算机通常是64位系统,在10年前,还有不少32位系统的计算机。32位系统的计算机有32根地址线,每根地址线都是物理线,通电时就有正电和负电两种状态。计算机会将表示正电、负电两种状态的电信号转换为表示1和0二进制序列的数字信号。每根地址线通电时都有正电、负电两种状态,都可以表示1或0。一共可以表示从00000000000000000000000000000000~11111111111111111111111111111111共2的32次方种二进制序列。每种二进制序列都可以作为内存编号,共有2^32个内存编号,内存编号称为内存地址。
内存单元大小:
空间是有大小的,内存每个空间的大小是多少呢?假设,内存每个空间的大小是1比特,以32位系统为例,可管理的内存空间是4,294,967,296个比特,也就是4,294,967,296 / 8 / 1024 / 1024 /1024 = 0.5G。其实在早期的32位系统中,2G是相当大的内存空间。如果内存每个空间的大小是1比特,那么不仅可管理的内存空间小,而且会将内存地址分的过细。例如:在C语言中,最小的变量类型是char类型,它占用空间的大小是一字节(8个bit), 都需要8个内存空间。于是,经过决议,就将每个内存空间的大小定为1字节,这样可以更加高效的利用内存空间。
指针:
如何查看变量存储地址:
当我们定义一个变量a并初始化值为10,那么计算机就会存储变量a。于是我们可以通过VS2022查看变量存储地址。
两种获取变量存储地址的方法:
- 通过调试—窗口—监视
- 通过调试—窗口—内存
具体操作请看VCR:
<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="gYcapDTg-1722041398785" src="https://live.csdn.net/v/embed/412899"></iframe>通过调试获取变量a的内存地址
在视频中,我们使用&a获取变量a存储的地址。&是取地址符,用于读取存储变量空间的地址。变量a是int类型,占用空间4字节,每一个字节都有一个地址。&a获取的是变量a的第一个地址。
当然,我们也可以直接输出变量a的内存地址。%p专门用来打印地址。
示例代码:
int a = 10;
//打印变量a的地址
printf("%p", &a);
运行结果:
当我们读取到变量a的地址,我们就可以把它放到一个变量里。C语言提供了指针变量,用于保存变量的地址。
示例代码:
//运用指针变量存储变量a的地址并输出
int a = 10;
int* pa = &a;
printf("%p\n", &pa);
运行结果:
代码分析:
&a:读取变量a的地址
pa:指针变量,存储变量a的地址,并指向变量a
*:表示pa是指针变量
int:表明指针指向对象的类型是整型
变量a和指针变量pa在空间中存储样式
解引用指针实现变量赋值
当然我们存放变量a的地址,肯定是为了做一些什么。就像我们记下同学的家庭地址,不仅仅只是为了记下地址,还可能为了未来需要他帮忙等。在这里,我们可以通过解引用指针变量pa的地址,来修改变量a的值。
示例代码:
#include <stdio.h>
int main()
{
int a = 10;
int* pa = &a;
//通过解引用指针变量pa,改变变量a的值
*pa = 30;
printf("a = %d\n", a);
return 0;
}
运行结果:
代码分析:
*间接访问操作符(解引用)
*pa = 30 :通过指针变量pa存放的地址,找到变量a的地址并将整型值30赋予变量a,变量a得到值30
指针变量大小
任何变量存储在计算机中都需要空间,那么存储不同类型地址需要多大空间呢?我们可以通过sizeof()操作符来输出不同类型地址占用空间大小。
示例代码:
//输出不同类型地址占用空间大小
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*));
printf("%d\n", sizeof(int*));
printf("%d\n", sizeof(float*));
printf("%d\n", sizeof(double*));
printf("%d\n", sizeof(long*));
printf("%d\n", sizeof(short*));
return 0;
}
运行结果:
X64操作平台(64位操作系统)
X86操作平台(32位操作系统)
由此可见,指针大小是相同的,指针是用来存放地址的。指针占用空间的大小,取决于地址存储所需要的大小,与变量类型无关。在不同的操作平台,指针的大小也不同。在32位操作系统中,指针的大小是四字节,在64位操作系统中,指针的大小是八字节。
标签:变量,pa,内存空间,C语言,地址,初识,内存,指针 From: https://blog.csdn.net/2401_84689376/article/details/140726806