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).也能够定义某种类型的值作为函数运行结束的输出(称为返回类型). 每一个函数有个函数名,用来描 ...
随机推荐
- Linux软件防火墙iptables
Netfilter组件 内核空间,集成在linux内核中 官网文档:https://netfilter.org/documentation/ 扩展各种网络服务的结构化底层框架 内核中选取五个位置放了五 ...
- 【python_PAT_乙类】1007_素数对猜想 ,Python运行超时解决方案
题目: 让我们定义dn为:dn=pn+1−pn,其中pi是第i个素数.显然有d1=1,且对于n>1有dn是偶数."素数对猜想"认为& ...
- 爱心代码_HTML
直接上效果 <!doctype html> <html> <head> <meta charset="utf-8"> <tit ...
- conda相关的设置备忘
因为默认channel已经没有3.4.4(最后一个支持xp的python3)了,为了添加这个的版本,尝试先用conda-forge channel: conda create -n myenv pyt ...
- jmeter性能测试小小实践
一.测试步骤 测试计划 / 线程组 / http请求 / 监听器 / 运行脚本 / 查看报告 二.线程组 线程组:虚拟用户数 ramp up period:设置虚拟用户数需要多长的时间全部启动,如果线 ...
- 02题解-洛谷 P2395 BBCode转换Markdown 题解
洛谷 P2395 BBCode转换Markdown 题解 题目传送门: here. 一道毒瘤的大模拟,给了你一部分的 BBCode 和 Markdown 语法,叫你转换.如下表: BBCode Mar ...
- Android 自定义View (三)
一.前言 上节 讲解了旋转圆环基本的实现方法.本文将在此基础上进一步改进,在属性文件中自定义控件属性,避免代码中显式调用setXXX() 方法. 二.流程 首先,在资源文件 values 中新建一个 ...
- MySQL数据库封锁机制和事务隔离级别
参考: 数据库技术:MySql学习笔记之事务隔离级别详解 详解MySQL 数据库隔离级别与MVCC MySQL 事务&&锁机制&&MVCC 数据库系统原理 - MySQ ...
- 【node打包缺包】Error: Can't walk dependency graph: Cannot find module 'jquery' from
问题: 在使用node打包时,终端报错提示Error: Can't walk dependency graph: Cannot find module 'jquery' from/.../ 这个提示缺 ...
- windows环境下本地项目(或gitlab上拉取项目)在Jenkins上自动打包部署 超超超详细!!!!!
一.环境准备 1.下载jdk,官网:http://www.oracle.com/ 2.下载Jenkins,官网:https://www.jenkins.io/ 3.下载Tomcat,官网:http:/ ...