day3 函数的定义和调用,练习编写简单的程序(记录2)
一、值传递、指针传递、引用传递
值传递:
在值传递中,函数的形参是由实参的副本初始化的,也就是说,函数内部操作的是实参的一个拷贝。值传递适用于传递简单数据类型(如整数、浮点数、字符等)以及小型结构体等,可以避免意外的修改和副作用,但代价是需要进行大量的拷贝操作,可能会影响程序性能。
指针传递:
在指针传递中,函数的形参是指向实参的指针,因此函数内部操作的是实参本身,可以避免拷贝操作,提高程序性能。指针传递适用于传递大型数据类型(如数组、结构体等),但需要注意指针是否为空或无效等问题,以及指针所指向的数据是否被修改的风险。
引用传递:
在引用传递中,函数的形参是实参的别名,它们共享同一块内存地址,因此函数内部操作的是实参本身,而不是副本或指针。引用传递适用于传递大型数据类型,可以避免拷贝和修改的风险,但需要注意引用的有效性和作用域。
二、指针传递和引用传递:如何选择
在C语言中,指针传递和引用传递都是常见的传递方式,各有其优缺点,具体使用时需要根据实际情况来选择。
指针传递和引用传递的最大区别在于形参的声明方式。在指针传递中,形参是一个指针类型,需要使用*来解引用;而在引用传递中,形参是一个引用类型,不需要使用*来解引用。两种传递方式都可以在函数内部对实参进行修改,都可以避免拷贝操作,提高程序性能。
一般来说,如果需要在函数内部修改实参的值,并且实参是一个简单数据类型(如整数、浮点数、字符等),那么建议使用指针传递。因为引用传递只适用于C++中的引用类型,在C语言中则需要通过指针来实现类似的效果。
如果需要传递大型数据类型(如结构体、数组等)或多个参数,可以使用指针传递或引用传递。但需要注意,使用指针传递时需要确保指针的有效性和安全性,避免非法访问或悬垂指针等问题;而使用引用传递时需要注意引用的作用域和生命周期,以及是否会对源数据造成修改等问题。
综上所述,选择使用指针传递或引用传递,需要根据实际情况进行权衡和选择。如果不确定应该使用哪种传递方式,可以根据数据类型、程序安全性、代码清晰度等因素来考虑,并进行适当的试验和测试,以达到最优的设计效果。
值传递适用于传递简单数据类型和不需要修改实参的函数;指针传递适用于传递数组、结构体等较大的数据类型,或者需要修改实参的函数;引用传递适用于传递较大的数据类型,并且需要在函数内部修改实参的值。总之,在选择传递方式时需要考虑到效率、安全性和代码的可读性等因素,以确保程序的正确性和稳定性。
非法访问或悬垂指针定义
非法访问或悬垂指针是指试图访问一个已经被释放或者未被正确初始化的指针所指向的内存,这样的操作通常会导致程序崩溃、数据损坏等严重问题。
非法访问指针通常发生在以下几种情况中:
指针未被正确初始化:在定义指针时没有初始化它的值,或者采用不可预期的值来初始化,这样的指针可能指向了一个随机的地址。如果尝试使用这样的指针访问内存,很可能会读取到错误的数据或者写入到错误的地址,导致程序运行异常。
指针越界:如果指针超出了它指向内存块的边界范围,也会导致访问非法内存。例如,在使用指针访问数组元素时,如果指针的偏移量超过了数组的长度,则访问就越界了。
释放指针后继续使用:如果在释放完指针所指向的内存之后,仍然继续使用这个指针,这样的操作就是非法的。因为已经释放的内存可能已经被其他程序或系统调用使用,如果继续使用这样的指针,就会导致数据损坏或非法访问。
悬垂指针指的是已经被释放的指针,这类指针虽然不再指向有效的内存地址,但是程序中仍然可能对其进行引用,导致非法访问、数据损坏等问题。避免悬垂指针的方法是要确保在释放指针之后,立即将指针设为 NULL,这样就可以避免对已经无效的指针进行误用。
为了避免非法访问和悬垂指针的问题,需要在程序设计和实现过程中严格控制指针的使用,并进行错误检查和处理。建议在定义指针时进行初始化,避免采用随机的、未定义的值。在使用指针访问内存之前,需要先检查指针是否为空或有效,避免越界或非法访问。在释放指针所指向内存之后,需要立即将指针设为 NULL,避免悬垂指针的出现。
day3 函数的定义和调用,练习编写简单的程序(记录2)的更多相关文章
- Python函数的定义与调用、返回值、参数
一.函数是什么 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.比如print(),len()等.但你也可以自己创建函数,这被叫做用户自 ...
- Kotlin基础(二)函数的定义与调用
函数的定义与调用 一.预备知识:在Kotlin中创建集合 fun main(args: Array<String>) { //Kotlin中定义各自集合 val ,,,) val list ...
- 12_传智播客iOS视频教程_注释和函数的定义和调用
OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...
- python中函数的定义及调用
python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...
- C#基础知识-函数的定义和调用(五)
函数也可以称为方法,可以很方便的把一些行为封装到函数里面,当调用这一函数时会把函数块里面的代码按照顺序执行,方法可以有多种形式,有无参数,有无返回值等. 1. 函数的定义 函数定义的基本格式: s ...
- JavaScript学习笔记(七)——函数的定义与调用
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- Python基础--函数的定义和调用
一.函数的作用: 提高代码的可读性,减少代码的冗余,方便调用和修改,组织结构清晰 二.函数的定义:函数遵循先定义后调用的原则 1.无参函数 def funcname(): #def 是关键字,后跟函数 ...
- python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数
1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...
- python中函数的定义与调用
1.为什么要用函数? (1)代码重复太多(2)可读性差 使用函数的好处: (1)代码重用 (2)保持一致性,易维护 (2)可扩展性 2.初始函数定义与调用 函数的定义 def test(x): ...
- Swift 函数的定义与调用(Defining and Calling Functions)
当你定义一个函数时,你能够定义一个或多个有名字和类型的值.作为函数的输入(称为參数.parameters).也能够定义某种类型的值作为函数运行结束的输出(称为返回类型). 每一个函数有个函数名,用来描 ...
随机推荐
- [自用初学]c++的构造函数
#include <stdio.h> #include <string.h> class Student { private: int id; char name[32]; p ...
- PLC入门笔记9
梯形图电路之电机控制 电机直接启动控制电路 电机正反停控制电路 我的图.. 但愿最后说的不要发生吧 例如下错了程序 导致... 最好外部电路互锁一下.. 电机故障判断电路 我的图.. 电机故障转换电路 ...
- PLC入门笔记6
计数器指令及其应用 计数器指令介绍 很多场合需要进行计数操作.例如电机启动次数.生产线物料经过次数.位置传感器传送的脉冲次数等. 计数器分为普通和高速两种. 比PLC扫描频率远小于用普通,接近或大于用 ...
- ABAP开发面向对象---类
今日学习ABAP面向对象里面的类,关于构造,继承,实现. 踩坑点:类有抽象的方法,类本身也需要是抽象的,故需要在类申明里面加上ABSTRACT关键字 学习资料为B站翱翔云天老师的 1 CLASS zc ...
- 安装win10:我们无法创建新的分区,也无法定位现有分区
操作环境:win10企业版ISO,U盘安装,UEFI启动 解决思路:win10 UEFI 安装需要硬盘在GPT模式,如果直接创建分区默认的是MBR,所以将磁盘转换成GPT,再分配一个EFI空白分区,就 ...
- Spring Cloud netty
<properties> <spring.boot.version>2.3.2.RELEASE</spring.boot.version> <spring.c ...
- Maven 中央仓库配置
Maven 中央仓库配置 Maven 中央仓库地址大全 <!-- 1.阿里中央仓库(首推1) --> <repository> <id>alimaven</i ...
- 2020/03/23--Diary
各位好! 我是R0ther,一位初学编程的学生.目前所学习到的有Java,C#,Winform,SQL-Server,H5,CSS3的一些基础知识,掌握一些Ae,Pr,Ps的基础应用. 虽然是大专文凭 ...
- app 好用的手机端开发调试工具插件 vconsole vue3
效果:可以在手机上看控制台的内容 $ npm install vconsole 在main.js里引入 // 添加移动端log查看调试器 import Vconsole from 'vconsole' ...
- MQ(部署模式)
MQ部署模式 1.master-slave部署模式 1)shared filesystem Master-Slave部署方式 主要是通过共享存储目录来实现master和slave的热备,所有的Acti ...