C语言初识指针

概述:

本文章主要介绍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查看变量存储地址。

两种获取变量存储地址的方法:

  1. 通过调试—窗口—监视
  2. 通过调试—窗口—内存

具体操作请看VCR: 

通过调试获取变量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位操作系统中,指针的大小是八字节。

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值