首页 > 其他分享 >C语言初识指针

C语言初识指针

时间:2024-07-27 09:26:47浏览次数:14  
标签:变量 pa 内存空间 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: 

<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

相关文章

  • c语言学习第三期
    1.if语句2.switch语句3.while循环4.for循环5.dowhile循环6.break和continue7.goto语句 1.if语句1.1ifif语句的语法形式如下: 表达式成⽴(为真),则语句执⾏,表达式不成⽴(为假),则语句不执⾏。在C语⾔中,0为假,⾮0表⽰真,也就是表达式的结果如果是0,则语句不执⾏,表达式......
  • 入门C语言Day19——猜随机数游戏
    之前学了分支与循环的很多内容,所以今天可以试着来运用之前的知识来试着写一些有趣的程序——猜随机数游戏。(当然,还有一些知识要补充。)这个多数人都应该有所耳闻,就是规定一个数字范围,然后去猜数字,根据反馈去调整所猜的数字直到猜对。所以我们假定电脑生成的随机数为1~100,并且......
  • 【python】对网站进行请求-初识
    python实现对网站进行请求代码如下importrequestsdefget_data(url,headers=None,params=None,timeout=10):try:res=requests.get(url,headers=headers,params=params,timeout=timeout)res.raise_for_status()returnres.text......
  • 【python】Django初识-从未有如此美妙的开局
    Django初识python、Django安装与验证python安装Python官网https://www.python.org/Django安装pipinstallDjango验证python是否安装成功python--version验证Django是否安装成功python3-mdjango--version创建第一个Django项目项目创建与服务器启动打开cmd,输......
  • 学习c语言第十四天(调试+练习)
    一、调试所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。1.什么是调试调试(英语:Debugging/Debug),又称除错,......
  • C语言大师之路:从零到王者/新手入门(3)选择语句
    序(一些闲话)我希望我的语言不要像专业书那样让人眼花缭乱,所以当我解释语法时,我会尽量避免使用太多专业术语,让说明更容易理解。我会用通俗易懂的语言来解释,而不是像专业书籍那样让人感到困惑。本人计划通过文章分享C语言的核心知识点和学习心得。鉴于仍处于学习阶段,文章中可......
  • C语言大师之路:从零到王者/新手入门(4)循环语句
    序(一些闲话)我希望我的语言不要像专业书那样让人眼花缭乱,所以当我解释语法时,我会尽量避免使用太多专业术语,让说明更容易理解。我会用通俗易懂的语言来解释,而不是像专业书籍那样让人感到困惑。本人计划通过文章分享C语言的核心知识点和学习心得。鉴于仍处于学习阶段,文章中可......
  • 【Kubernetes】初识K8S基础
    目录一.K8S概述1.K8S背景物理机的缺点虚拟机特点(解决了物理机的缺点)虚拟机缺点容器化特点(解决了虚拟机的缺点)容器化缺点2.K8S基本概念2.1.作用2.2.特点二.K8S 集群架构与组件1.集群架构介绍2.核心组件2.1.Master组件Kube-apiserver:是所有服务请求的统一访问入......
  • c语言学习之输入输出--getchar、scanf、printf
    1.输入输出功能  (1).C语言本身并不提供输入输出功能。  使用的是c语言函数库中的"标准输入输出"函数 (2).c语言函数库提供的输入输出函数   getchar、putchar:操作一个字符 'a'  gets、puts:操作一个字符串 如"abcd"   scanf、printf:格式化......
  • C语言中的输入输出
    简单格式的输入输出简单的输出语句:printf语法printf"格式控制"输出表列举例:printf("%d,%f,%c",a,b,c);说明:由%和特定字符组成,如:%d、%c、%f等,是格式说明符,用于说明输出项目所采用的格式;基本的格式字符%d按十进制整型数据的实际长度输出。%c仅输出一个字符。......