一、值传递、指针传递、引用传递

值传递:

在值传递中,函数的形参是由实参的副本初始化的,也就是说,函数内部操作的是实参的一个拷贝。值传递适用于传递简单数据类型(如整数、浮点数、字符等)以及小型结构体等,可以避免意外的修改和副作用,但代价是需要进行大量的拷贝操作,可能会影响程序性能。

指针传递:

在指针传递中,函数的形参是指向实参的指针,因此函数内部操作的是实参本身,可以避免拷贝操作,提高程序性能。指针传递适用于传递大型数据类型(如数组、结构体等),但需要注意指针是否为空或无效等问题,以及指针所指向的数据是否被修改的风险。

引用传递:

在引用传递中,函数的形参是实参的别名,它们共享同一块内存地址,因此函数内部操作的是实参本身,而不是副本或指针。引用传递适用于传递大型数据类型,可以避免拷贝和修改的风险,但需要注意引用的有效性和作用域。

二、指针传递和引用传递:如何选择

在C语言中,指针传递和引用传递都是常见的传递方式,各有其优缺点,具体使用时需要根据实际情况来选择。

指针传递和引用传递的最大区别在于形参的声明方式。在指针传递中,形参是一个指针类型,需要使用*来解引用;而在引用传递中,形参是一个引用类型,不需要使用*来解引用。两种传递方式都可以在函数内部对实参进行修改,都可以避免拷贝操作,提高程序性能。

一般来说,如果需要在函数内部修改实参的值,并且实参是一个简单数据类型(如整数、浮点数、字符等),那么建议使用指针传递。因为引用传递只适用于C++中的引用类型,在C语言中则需要通过指针来实现类似的效果。

如果需要传递大型数据类型(如结构体、数组等)或多个参数,可以使用指针传递或引用传递。但需要注意,使用指针传递时需要确保指针的有效性和安全性,避免非法访问或悬垂指针等问题;而使用引用传递时需要注意引用的作用域和生命周期,以及是否会对源数据造成修改等问题。

综上所述,选择使用指针传递或引用传递,需要根据实际情况进行权衡和选择。如果不确定应该使用哪种传递方式,可以根据数据类型、程序安全性、代码清晰度等因素来考虑,并进行适当的试验和测试,以达到最优的设计效果。

值传递适用于传递简单数据类型和不需要修改实参的函数;指针传递适用于传递数组、结构体等较大的数据类型,或者需要修改实参的函数;引用传递适用于传递较大的数据类型,并且需要在函数内部修改实参的值。总之,在选择传递方式时需要考虑到效率、安全性和代码的可读性等因素,以确保程序的正确性和稳定性。

非法访问或悬垂指针定义

非法访问或悬垂指针是指试图访问一个已经被释放或者未被正确初始化的指针所指向的内存,这样的操作通常会导致程序崩溃、数据损坏等严重问题。

非法访问指针通常发生在以下几种情况中:

指针未被正确初始化:在定义指针时没有初始化它的值,或者采用不可预期的值来初始化,这样的指针可能指向了一个随机的地址。如果尝试使用这样的指针访问内存,很可能会读取到错误的数据或者写入到错误的地址,导致程序运行异常。

指针越界:如果指针超出了它指向内存块的边界范围,也会导致访问非法内存。例如,在使用指针访问数组元素时,如果指针的偏移量超过了数组的长度,则访问就越界了。

释放指针后继续使用:如果在释放完指针所指向的内存之后,仍然继续使用这个指针,这样的操作就是非法的。因为已经释放的内存可能已经被其他程序或系统调用使用,如果继续使用这样的指针,就会导致数据损坏或非法访问。

悬垂指针指的是已经被释放的指针,这类指针虽然不再指向有效的内存地址,但是程序中仍然可能对其进行引用,导致非法访问、数据损坏等问题。避免悬垂指针的方法是要确保在释放指针之后,立即将指针设为 NULL,这样就可以避免对已经无效的指针进行误用。

为了避免非法访问和悬垂指针的问题,需要在程序设计和实现过程中严格控制指针的使用,并进行错误检查和处理。建议在定义指针时进行初始化,避免采用随机的、未定义的值。在使用指针访问内存之前,需要先检查指针是否为空或有效,避免越界或非法访问。在释放指针所指向内存之后,需要立即将指针设为 NULL,避免悬垂指针的出现。

day3 函数的定义和调用,练习编写简单的程序(记录2)的更多相关文章

  1. Python函数的定义与调用、返回值、参数

    一.函数是什么 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.比如print(),len()等.但你也可以自己创建函数,这被叫做用户自 ...

  2. Kotlin基础(二)函数的定义与调用

    函数的定义与调用 一.预备知识:在Kotlin中创建集合 fun main(args: Array<String>) { //Kotlin中定义各自集合 val ,,,) val list ...

  3. 12_传智播客iOS视频教程_注释和函数的定义和调用

    OC的注释和C语言的注释一模一样.它也分单行注释和多行注释. OC程序里面当然可以定义一个函数.并且定义的方式方法和调用的方式方法和我们C语言是一模一样的.OC有什么好学的?一样还学个什么呢? 重点是 ...

  4. python中函数的定义及调用

    python中函数的定义及使用方法 1.函数的概念:函数是将具有独立功能的代码块组织为一个整体,使其具有特殊功能的代码集; 2.函数的作用:使用函数可以加强代码的复用性,提高程序编写的效率; 3.函数 ...

  5. C#基础知识-函数的定义和调用(五)

    函数也可以称为方法,可以很方便的把一些行为封装到函数里面,当调用这一函数时会把函数块里面的代码按照顺序执行,方法可以有多种形式,有无参数,有无返回值等. 1. 函数的定义   函数定义的基本格式: s ...

  6. JavaScript学习笔记(七)——函数的定义与调用

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  7. Python基础--函数的定义和调用

    一.函数的作用: 提高代码的可读性,减少代码的冗余,方便调用和修改,组织结构清晰 二.函数的定义:函数遵循先定义后调用的原则 1.无参函数 def funcname(): #def 是关键字,后跟函数 ...

  8. python基础----函数的定义和调用、return语句、变量作用域、传参、函数嵌套、函数对象、闭包、递归函数

    1.函数的定义: 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你也可 ...

  9. python中函数的定义与调用

    1.为什么要用函数? (1)代码重复太多(2)可读性差 使用函数的好处: (1)代码重用 (2)保持一致性,易维护 (2)可扩展性 2.初始函数定义与调用     函数的定义 def test(x): ...

  10. Swift 函数的定义与调用(Defining and Calling Functions)

    当你定义一个函数时,你能够定义一个或多个有名字和类型的值.作为函数的输入(称为參数.parameters).也能够定义某种类型的值作为函数运行结束的输出(称为返回类型). 每一个函数有个函数名,用来描 ...

随机推荐

  1. unable to access 'http://*****/': The requested URL returned error: 414

    git拉取gitlab项目: unable to access 'http://git.yijiago.com/meimeng/lsyjg_java.git/': The requested URL ...

  2. 一键搭建dns

    #!/bin/bash DOMAIN=wang.orgHOST=wwwHOST_IP=10.0.0.100LOCALHOST=`hostname -I | awk '{print $1}'` . /e ...

  3. Tomcat和Maven安装与配置

    链接:https://pan.baidu.com/s/1aezz2pfCn0DCCPw8udQFXA 提取码:wd4f 一.网站发布1.1.为什么要用tomcat网页开发好了,该如何发布呢?我们需要一 ...

  4. matlab 将某文件夹的内容复制到另一文件下

    %% 清空close all;clear;clc; %% 选择文件路径(复制某文件夹下部分文件夹到其他路径)folder = uigetdir('C:\Desktop','请选择文件夹'); %% i ...

  5. Vue3+Vite项目中 使用WindiCSS.

    之前工作有了解过根据类名来写元素的样式,一听就发出疑问:这样写项目可读性恐怕不是很好吧... 之后来到杭州工作后,开始使用WindiCSS后发现 真香!!!  由于近期所写的项目都是自己一个人开发的 ...

  6. vue中router.resolve

    resolve是router的一个方法, 返回路由地址的标准化版本.该方法适合编程式导航. let router = this.$router.resolve({ path: '/home', que ...

  7. power shell 删除应用

    public static UwpAppInfo SearchUwpAppByName(string appName) { UwpAppInfo app = null; try { string re ...

  8. Collectors类的静态工厂方法-《Java 8实战》笔记

  9. swagger 兼容 docker 转发 配置

    app.UseSwagger(c => { c.PreSerializeFilters.Add((swagger, httpReq) => { string swagger_index_u ...

  10. JSP环境搭建及入门 和 虚拟路径和虚拟主机

    Jsp:是一个动态网页,而不是静态网页 html,css,js,Jquery:是静态网页 动态网页是随着,时间,地点,用户操作,而改变 静态不需要jsp 动态是需要的 BS 可以通过浏览器直接访问浏览 ...