指针--传址和传值

2024-06-01 13:36
文章标签 指针 传值 传址

本文主要是介绍指针--传址和传值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在我们之前的学习中,我们学到了指针等相关知识,那么传址和传值是什么意思呢?顾名思义,传值是将变量传给函数,传址就是把变量的地址传给函数

我们先来复习一下前面的知识,当然,详情可以通过下面链接学习

指针相关知识(入门)-CSDN博客

形参和实参:

形参(parameter):形参(形式参数)是在函数定义中出现的参数,是一个虚拟参数,调用之前并没有给他分配内存,可以看作是一个占位符,在函数定义时没有实际的数值,只有在函数调用时才会接收到传递进来的数据;只是因为函数需要从别处传递数据,为了表示此数据,起了一个名字,是出于函数形式上的考虑,故称之为形参。

实参(argument):实参(实际参数)是在函数中实际出现的参数,实参的值可以是常量、变量、表达式、类等,实参必须要有确定的值。

注意:

形参是一个名字,本身不占内存,只有在函数调用时才会分配内存;

形参在函数定义时出现,在函数体内可以使用,离开该函数体则不能使用

形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放分配的内存单元,除了重新调用,否则不能再重新使用形参。

实参是一个变量,在定义时就已分配内存地址。

实参出现在主调函数中,进入被调函数时不能使用。

实参:全局变量:程序运行期一直存在,从程序开始到结束。

局部变量:随着函数的结束,即被销毁

传值

函数的实参传给形参时,形参是实参的一份临时拷贝,形参有自己的独立空间,对形参的修改不能影响实参

如果按照我们的正常逻辑,将两个整数类型的值调换,用函数代码如下

int Swap(int x, int y)
{int z;z = x;x = y;y = z;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("%d %d\n", a, b);Swap(a, b);printf("%d %d\n", a, b);return 0;
}

但是运行结果却与预期不一样

这就是改变了形参但是对实参没有影响的原因

正确代码如下所示

int Swap(int* px, int* py)
{int z = 0;z = *px;*px = *py;*py = z;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("%d %d\n", a, b);Swap(&a, &b);printf("%d %d\n", a, b);return 0;
}

 那么,通过上面的学习,我们来总结一下,使用传值和传址的情况吧

传值:只是需要主函数里面的变量值计算

传址:函数内部要修改主函数中的变量值

通俗的说,就是如果在函数调用里面需要用到主函数里面的变量并且对变量进行修改或操作,那么就要用传址,才能使调用函数对主函数操作成功;反之,如果调用函数里面不对主函数修改,只是要用到主函数里面的变量值,就用传值

这篇关于指针--传址和传值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

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

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

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

SpringMVC前后端传值的几种实现方式

《SpringMVC前后端传值的几种实现方式》本文主要介绍了SpringMVC前后端传值的方式实现,包括使用HttpServletRequest、HttpSession、Model和ModelAndV... 目录一、从Controller层到JSP界面1、使用HttpServletRequest的方式2、使

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

C语言指针入门 《C语言非常道》

C语言指针入门 《C语言非常道》 作为一个程序员,我接触 C 语言有十年了。有的朋友让我推荐 C 语言的参考书,我不敢乱推荐,尤其是国内作者写的书,往往七拼八凑,漏洞百出。 但是,李忠老师的《C语言非常道》值得一读。对了,李老师有个官网,网址是: 李忠老师官网 最棒的是,有配套的教学视频,可以试看。 试看点这里 接下来言归正传,讲解指针。以下内容很多都参考了李忠老师的《C语言非

C和指针:字符串

字符串、字符和字节 字符串基础 字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。 字符串长度就是字符串中字符数。 size_t strlen( char const *string ); string为指针常量(const修饰string),指向的string是常量不能修改。size_t是无符号数,定义在stddef.h。 #include <stddef.h>