再识C语言 DAY15 【指针(中)理论结合实践】

2024-02-07 09:20

本文主要是介绍再识C语言 DAY15 【指针(中)理论结合实践】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、补充
  • 二、数组与指针
    • 指针运算
  • 注意事项
  • 指针的应用
    • 传递参数(指针的间接访问)
    • 指针输出参数
  • 如果您发现文章有错误请与我留言,感谢


前言

本文章总结于此视频


一、补充

指针即指针变量,用于存放其他数据单元(变量/数组/结构体/函数等)的首地址。若指针存放了某个数据单元的首地址,则这个指针。指向了这个数据单元,若指针存放的值是0,则这个指针为空指针

如图所示:
在这里插入图片描述

另外,在一个系统上指针所占用的字节是确定不变的
在这里插入图片描述

我们这里使用的64位系统都是占八个字节,这是一个很关键的信息

二、数组与指针

数组与指针可以说是非常相似,数组是一些相同数据类型的变量组成的集合,其数组名及为指向该数据类型的指针。当你在写一个数组arr[]不写[ ],此时的arr就等效于指针,

如图所示

在这里插入图片描述

我们尝试一下

在这里插入图片描述

指针运算

当然,这里也涉及到了运算
在这里插入图片描述

注意:如果只是一个单独的变量就不要使用加或减,因为此时会指向非法的区域

我们可以取变量的地址来直观的学习
在这里插入图片描述

我们可以直观地观察到他们的不同,int数据类型的地址增加了四个字节char数据类型的地址增加了一个字节

所以为什么要移动一个数据类型的长度,我们前面知道指针记录的是首地址,实际上他们的类型是int 和char,我们可以想想对于int类型的数组,比如说他第一个数据地址是1,2,3,4,如果他只移动一个地址,那么你认为第二个数的地址是2,3,4,5,但实际上第二个数的地址是5,6,7,8

在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f4c04b3e7311476db2956159641522b0.jpeg#pic_center)

在这里插入图片描述

图片出处

如上图所示表示数组中5个元素在内存中的存储,其中p1指向第一个元素的地址p2表示第五个元素的地址,代码中用p2-p1,就表示的是两个指针之间的元素个数,很清楚的看到是4个元素,所以打印出来结果为4

注意事项

• 在对指针取内容之前,一定要确保指针指在了合法的位置,否则将会导致程序出现不可预知的错误
•同级指针之间才能相互赋值,跨级赋值将会导致编译器报错或警告

什么是同级指针
在这里插入图片描述
比如说变量在和指针之间赋值时,当变量加上取地址&,就是正确的,或者指针加上*

如果不是同级指针,赋值时将会报错。

在这里插入图片描述

int a=1;
int* p;
*p=a;//或者
P=&a;

指针的应用

传递参数(指针的间接访问)

传递参数时,我们分为值传递和指针传递

当我们传递的参数容量很大时,我们尽量使用指针传递

因为使用指针传递大容量的参数时,主函数和子函数使用的是同一套数据,避免了参数传递过程中的数据复制,提高了运行效率,减少了内存占用

我们举一个例子,让他更直观一些:我们假设主函数是一个学霸,我们创建新函数是一个学渣,把主函数内的一个变量假设为作业的话,如果学渣想要抄学霸作业,得到这个变量,但是主函数学霸是不会将变量直接给学渣函数的,他会先把作业抄一遍,把这个复制的作业给学渣,这样就算学渣在这个复制体作业上更改数值,也不会影响到主函数学霸的变量

作业如果是选择题还好说,但如果是作文的话,复制一份既费时又费力,这里我们就可以引用指针传递

比如说我们现在想传递一个数组,数组就属于大容量变量

#include<stdio.h>
int FindMax(int* arr,int Count)
{int i;int j=arr[0];for(i=1;i<Count;i++){if(j<arr[i]);{j=arr[i];}                      }return j;
}
int main()
{int max;int arr[5]={10,20,30,40,50};
max = FindMax(arr,5);
printf ("%d",max);return 0;
}

输出

在这里插入图片描述

但是此时我们发现,我们是可以通过改变变量的值来影响主函数中变量的值
在这里插入图片描述
这时我们就想到之前学的常量指针,当我们在其他函数中改变变量的值时,编译器就会报错警告我们, 所以使用常量指针是我们指针传递中的一个保护措施
在这里插入图片描述
相比较,值传递隔离,数据安全,但是当遇到大容量的数据是会占用较多的空间和时间。指针传递可以处理大容量的数据。为了使数据更安全,我们可以使用常量指针。

指针输出参数

使用指针传递输出参数,利用主函数和子函数使用同一套数据的特性,实现数据的返回,可实现多返回值函数的设计
我们发现第一个应用是避免主函数与子函数使用同一套数据,而第二个应用是反过来的,我们要利用主函数和子函数使用同一套数据,实现多返回值

因为C语言有一个弊端,那就是只能有一个返回值,当我们要返回多个值时,就需要用到指针的这个特征

例题:找到数组中最大的数,和其出现的次数。

#include<stdio.h>
int FindMax(int* max,int* count,int* arr,int lenght)
{int i;*max=arr[0];*count=1;for(i=1;i<lenght;i++){if(*max<arr[i]){*max =arr[i];*count=1;}       else if(*max==arr[i]){(*count)++;}               }
}
int main()
{int MAX,Max;int Count;int arr[5]={10,50,30,40,50};
MAX = FindMax(&Max,&Count,arr,5);
printf ("%d\n",Max);
printf ("%d",Count);return 0;
}

运行:

在这里插入图片描述
所以说指针打破了C语言的只能有一个返回值,理论上我们可以用指针写出无数个返回值


如果您发现文章有错误请与我留言,感谢

这篇关于再识C语言 DAY15 【指针(中)理论结合实践】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/687266

相关文章

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Spring Boot项目中结合MyBatis实现MySQL的自动主从切换功能

《SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能》:本文主要介绍SpringBoot项目中结合MyBatis实现MySQL的自动主从切换功能,本文分步骤给大家介绍的... 目录原理解析1. mysql主从复制(Master-Slave Replication)2. 读写分离3.

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶