指针--传址和传值

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.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>

【C++】作用域指针、智能指针、共享指针、弱指针

十、智能指针、共享指针 从上篇文章 【C++】如何用C++创建对象,理解作用域、堆栈、内存分配-CSDN博客 中我们知道,你的对象是创建在栈上还是在堆上,最大的区别就是对象的作用域不一样。所以在C++中,一旦程序进入另外一个作用域,那其他作用域的对象就自动销毁了。这种机制有好有坏。我们可以利用这个机制,比如可以自动化我们的代码,像智能指针、作用域锁(scoped_lock)等都是利用了这种机制。

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

C和指针:结构体(struct)和联合(union)

结构体和联合 结构体 结构体包含一些数据成员,每个成员可能具有不同的类型。 数组的元素长度相同,可以通过下标访问(转换为指针)。但是结构体的成员可能长度不同,所以不能用下标来访问它们。成员有自己的名字,可以通过名字访问成员。 结构声明 在声明结构时,必须列出它包含的所有成员。 struct tag {member-list} variable-list ; 定义一个结构体变量x(包含

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><