参数传递问题

一直没有好好研究C语言参数传递,只是从书上看,知道有传值和传地址两种方式,有时候一知半解真的不行,看似懂了,遇到问题后就乱了手脚,他们内部发生什么变化并不清楚,现在写下来。
C语言的参数传递有传值和传地址两种方式。
传值的过程:
(1)行参与实参各占一个独立的存储空间。
(2)行参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时
存储区,然后将各实参之值传递给行参,这时行参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
传值的特点:单向传递,即函数中对行参变量的操作不会影响到调用函数中的实参变量。
例如:
#include <stdio.h>

void change_by_value(int x){
    x=x+10;
}
void change_by_address(int *x){
    *x=*x+10;
}
void main(){
    int a=3;
    printf("a=%d/n",a);
    change_by_value(a);
    printf("a=%d/n",a);//a的值并没有改变
    change_by_address(&a);
    printf("a=%d/n",a);//
}
运行结果:
3
3
13
传值方式:
void change_by_value(int x)内部发生的动作应当是当函数被调用时(堆栈调用)
在堆栈上临时分配了一块区域,调用结束,出栈。
void change_by_value(int x){
    int _x=x;//拷贝一份传递给临时变量_x
    _x=_x+10;//改变的是_x,不是x
}
地址传递方式:参数是地址
void change_by_address(int *x){
    *x=*x+10;
}
实参和行参共享一个存储单元,对行参的操作相应的就改变了实参,此时参数传递是双向的。
此外,参数的存储位置和变量的存储属性对参数传递也有影响,变量的存储属性有动态变量、静态变量
外部变量,动态变量有2种,自动(auto)和寄存器(register)变量。


存储属性


register


auto


static


extern


存储位置


寄存器


主存


生存期


动态生存期


永久生存期


作用域


局部


局部或全局


全局

此外还应注意内存的分配方式,内存分配方式有三种:
(1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的
整个运行期间都存在。例如全局变量,static 变量。
(2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函
数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集
中,效率很高,但是分配的内存容量有限。
(3) 从堆上分配,亦称动态内存分配。程序在运行的时候用malloc 或new 申请任意
多少的内存,程序员自己负责在何时用free 或delete 释放内存。动态内存的生存
期由我们决定,使用非常灵活,但问题也最多。

时间: 2024-08-04 21:39:51

参数传递问题的相关文章

C++函数调用时的参数传递-3中传递方式

参数传递即实参向形参传递信息,使形参获得对应的存储空间及初值,C++中函数传递主要有3种方式: 1.按值传递. 以按值传递方式进行参数传递的过程为:首先计算出实参的值,然后给它所对应的形参变量分配存储空间,该空间大小等于该形参类型的长度,然后把实参值存入到为形参分配的存储空间里去,该值即为形参的初值,在函数被调用时使用.而这种方式被调用的函数对实参的值改变不会有任何的影响,也就是说,即使形参的值在函数中被改变,也不会对实参值产生任何影响,实参值仍为被调用之前的值.究其原因还是实参和形参各占独立的

java面向对象-3-方法参数传递

java的方法不能独立存在,一定是在类中的,并且java中方法的参数一定是值传递的.但是,有时候因为参数是引用类型,比如String类型,数组类型,String str="hello world";str这个标识符所指向的内存块并不是"hello world"那个内存块,而是"hello world"内存块的地址.这个时候,我们就会发现,java中方法参数传递感觉不是值传递,因为方法操作完后,原来的值也变了,其实不是,这只是我们的错觉.方法操作完

C语言之参数传递

学了四年的计算机,一直让自己比较苦恼的问题是C语言的参数传递问题,之所以说是苦恼,是因为在某年的一个学期,不幸接触到数据结构,光一个链表就把自己弄得死去活来的,而且自已一直就楞以为在操作的过程中,传递参数的指针也在发生变化,结果可想而知,数据结构成了自己专业课里面险些挂彩的一门课程. 直至最近,拿出数据结构打算恶补一下前些年欠下的债,第一件事情,还是先解决好当时困扰自己半年之久的C语言参数传递问题吧. C语言课堂上,自己明明记得参数传递问题我已经搞懂了,只不过当时没有接触过C plus plus

oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)

这篇文章主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下 oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程和函数是以命名的方式存储于数据库中的.和PL/SQL程序相比,存储

参数传递

java语言的参数传递问题 基本数据类型的参数传递,形式参数的改变对实际参数没有影响,因为传递的是具体的数值 引用数据类型的参数传递,形式参数的改变对实际参数有影响,因为传递的是地址值 ; ( String 例外) java中到底是传值还是传地址 1.既是传值,也是传地址,基本数据类型传递的值,引用数据类型传递的地址 2.java中只有传值,因为地址也是值(出去面试都说这种,支持者是高斯林java之父)

Java基础知识笔记(七:接口、变量作用域和参数传递)

一.接口 Java语言不允许一个子类拥有多个直接父类,即任何子类只能有一个直接父类.但允许一个类实现多个接口,即在定义类的接口名称列表中可以包含1个或多个接口名称,从而实现多重继承的特性.接口的定义格式如下: [接口修饰词列表] interface 接口名 [extends 接口名称列表] { 接口体 } 接口修饰词列表可以包含0个.1个或者多个接口修饰词.如果存在多个接口修饰词,则在相邻两个接口修饰词之间采用空格分隔开.接口修饰词包括:public.abstract和strictfp等.在同一

java中参数传递

总之一句话:java中只有副本传递,对于值,拷贝值,对于引用,拷贝引用(对于数组,数组名传递的都是引用). /** * java中只有副本传递,对于值,拷贝值,对于引用,拷贝引用(对于数组,数组名传递的都是引用). * @author sargeles */ public class About_Onlyvaluetransmit { /** * 测试一组:基本类型传递是按值传递,意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本. * String因为两个原因表现出基本类型的特征

Java的参数传递问题

Java中方法的参数传递方式是什么? 相信不少人会认为Java和C是一样的:当参数是基本数据类型时采用值传递而参数是非基本数据类型是采用引用传递即地址传递.真的是这样吗? 先看段代码: public class Snippet { public static void main(String[] args) { MyObj obj = new MyObj(); System.out.println(obj.age); process(obj); System.out.println(obj.ag

JavaSE-方法的参数传递

/* *方法的参数传递 1.形参:方法声明时,方法小括号里内的参数 实参:调用方法时,实际传入的参数的值 2.规则:java中的参数传递机制:值传递机制 1)形参是基本数据类型的:将实参的值传递给形参,实质是栈内存中新开辟了一块内存,存放实参的副本,副本的值和实参相同,对副本进行操作不影响实参.形参在方法结束后就被JVM回收了,栈内存中就不存在了 2)形参是引用数据类型的:将实参的引用类型的值(对应的堆空间的对象实体的首地址)传递给形参的引用类型变量,只是地址传给 */ class TestJa

(一)Activity参数传递

1.主Activity,用于启动另一个Activity()public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println("onCreate");