C语言入门Day_22 初识指针

news/2024/10/18 0:26:20/

目录

前言:

1.内存地址

2.指针的定义

3.指针的使用

4.易错点

5.思维导图 


前言:

 之前我们学过变量可以用来存储数据,就像一个盒子里面可以放不同的球一样。

这是一个方便大家理解专业概念的比喻

在计算机世界里面,数据实际上是以二进制的形式存储在内存中。

1.内存地址

1.1

我们在编程语言中使用数据是通过变量和常量的方式,

比如代表整数的int,代表浮点数的float,代表字符的char等等。

这些数据类型已经是编程语言(C语言)为了方便人类(程序员)理解,而封装出来的机制。

这些数据都存储在计算机的内存中,并且是以二进制的形式存储。

这些数据存储在计算机中的具体位置,就叫做内存地址

1.2

我们可以记住这样一个对照图,最下面是最接近计算机硬件的内存地址

上面一层是一个具体的数据

最上面一层是我们在编程中使用数据的方式

事实上内存地址也是一种“虚拟”的机制,具体的数据在硬件中的存储方式还有很多细节的处理,

但是对于程序或者编程而言,理解到这一层就已经够了。

1.3

我们知道了计算机中存储数据的原理是内存地址的机制以后,接下来我们学习一下C语言中是如何“直接”操作内存地址的——指针

 大部分编程语言,比如大家可能听过的Pyhon和Java,都无法直接操作内存中的数据,而是要通过变量或者常量的方式来"间接"操作内存中的数据。

细究起来,指针本质上也是一个变量,但是这个变量的特别之处在于,他存储的不是整形,浮点型和字符型这种可以被使用的数据类型,它存储的是——内存地址

1.4

 所以我们可以简单的理解为,在C语言中,指针就是内存地址,内存地址就是指针。

2.指针的定义

2.1

 指针的定义和变量的定义基本一样,只不过会多一个符号*

下面我们来定义一个指针:

int *p1;

1.这个指针会指向的数据类型——整型   int

2.指针的符号——星号   *

3.指针名—— p1

2.2

 刚才我们只是定义了一个指针变量,要完整的定义指针,我们还需要把指针“指向”一个变量;

定义一个指针p1,并把这个指针指向整型变量number_1:

int number_1=10;
int *p1;
p1=&number_1;
printf("%d\n",*p1);

1.定义一个整型变量   int number_1 = 10;

2.定义一个指向整型数据的指针   int  *p1;

3.把指针指向整型变量的内存地址   &number_1;

4.这个符号代表着number_1所在的内存地址   &

5.打印这个指针指向的数据   printf("%d\n", *p1);

2.3

我们再来回顾一下,我们定义了一个变量number_1,他所存的数据有一个自己的内存地址,

然后我们定义了一个指针p1,用这个指针指向了这个内存地址

最后我们访问了这个指针所指向的数据。

 2.4

刚才已经简单的使用了指针,我们用p1指针指向了一个定义好的整型变量,并且通过指针(而非变量)访问了这个数据。 

如果仅仅是这样使用,指针肯定算不上“灵活”,我们还可以把指针指向不同的变量,来使用不同的数据

所以我们又把指针称为指针变量,因为一个指针存储的内存地址也是可以改变或者重新赋值的

3.指针的使用

3.1

在上面学习中,我们只是把指针指向了一个变量,现在我们尝试把指针指向不同变量

int number_1=10;
int number_2=55;
int *p1;
p1=&number_1;
printf("%d\n",*p1);
p1=&number_2;
printf("%d\n",*p2);

1.定义两个变量number_1和number_2

int number_1 = 10;

int number_2 = 55;

2.定义一个整型的指针变量p1

int *p1;

3.把指针指向变量number_1,然后打印它

p1 = &number_1;

printf("%d\n", *p1)

4.然后再把指针指向变量number_2,然后打印它

p1 = &number_2;

printf("%d\n", *p1);

我们可以看到,通过把指针指向不同的变量,我们可以访问不同变量的数据,需要注意的是,这个指针只能指向“相同数据类型”的变量

3.2

最后就是一些使用指针的好习惯,比如初始化定义的时候,我们需要把指针指向一个空的地址NULL,当我们要使用它的时候再把它指向一个具体的变量。 

int *p1 = NULL;

4.易错点

5.思维导图 

最后我想说的是:

 在撰写这篇文章时,我参考了《白纸编程》这个app的观点和思想,我要感谢他们对我的启发和帮助。


http://www.ppmy.cn/news/1115803.html

相关文章

Python vs C#:首先学习哪种编程语言最好?

进入编码可能很困难。 最艰难的部分? 决定先学什么语言。 当谈到 Python 与 C# 时,可能很难知道在您的决定中要考虑哪些因素。 我们为您提供了有关这些全明星编程语言的所有信息。 什么是 C#? 自 2000 年作为 Microsoft Visual Studio 的一部分开发 C# 以来,它一直是开发人…

【WFA】【Enhanced open】CT_OWE_DHgroup_STA_NoAssociation-AllGroupsRejected_10338_1

测试报告如下: Fail的关键log: 当连接到ap失败时,驱动程序将尝试连接到ap。如果ap仅支持Group 20,并且sta支持Group 19、20。sta将首先尝试Group 19,ap将通过状态代码77拒绝它。然后驱动程序将尝试连接Group 19的ap,仍然达到最大重试次数。那么sta将尝试第Group 20 。 …

Android 数据库封装(SQLite)

Android 数据库操作(SQLite) Android 数据库操作(SQLite)动态预览使用初始化生成表实体类插入数据批量插入删除数据删除全部修改数据查找(列表)查找(单条)条件查找(列表&…

三步实现Mybatis(Mybatis-Plus)多数据源配置

前言 要实现多数据源可以采用dynamic-datasource或者mybatis-mate,本文就以dynamic-datasource为例 dynamic-datasource简介 springboot 快速集成多数据源的启动器 使用文档(opens new window) 支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主…

【Python基础】P01S01 变量与字符串

P01S01 变量与字符串 变量变量的命名规则 字符串字符串的表达方法字符串的基本操作 数整数与浮点数数中下划线常量 注释 变量 变量的命名规则 变量名只能包含字母、数字和下划线; 变量名能以字母或下划线开头,但是不能以数字开头; 变量名不能…

Android使用glide时报错“ ����: �޷�����Fragment Glide.with(getContext()) ^ �Ҳ���and”

在gradle.properties中添加下面两行代码 即可 android.useAndroidXtrue android.enableJetifiertrue

Electron(v26.2.1)无法加载React Developer Tools(v4.28.0)

一开始按照electron官网上的 开发者工具扩展 教程设置React Developer Tools时,重启项目后并没有按照预期成功加载React Developer Tools,而且控制台报错: Permission scripting is unknown or URL pattern is malformed.查了下原因是因为Re…

前端开发中常见的跨域问题及解决方案

引言 在前端开发中,跨域问题是一个非常常见的问题。本文将详细介绍什么是跨域,常见的跨域场景,以及各种常用的跨域解决方案。 什么是跨域 跨域是指一个网页或者Web应用在浏览器中发起对另一个域名下资源的请求。由于浏览器的同源策略限制&…