下面两个C程序的传值传值和传址的区别

因为循环变量初值是1所以nums[0]不会輸出

函数返回,m被舍弃输出:

由于子程序中没有计算过m,所以m值一直是初始的1这个m是函数自己临时定义的变量,用来接收调用者传进來的参数main函数将vale的值0传递给m,计算完后函数返回,m被舍弃不会影响value的值(作为参数,是取value的值来用一下然后就没有value的事了)

如果想将m嘚值返回,那么有两种办法:

此篇为复习考研专业课(数据结構)笔记记录一个值得研究的问题。小哥我是为千百计算机考研大军中的一人专业课数据结构,今天为大家分享一个有关于c语言指针傳值传值的问题其中夹带了许多个人理解,欢迎批评指正

大家都知道指针的使用是c语言编程的基础核心,今天我们就来探讨一下传入*a與*&a的区别

简单的说一下这两个东西:

*a :在定义变量时表示的是一个指针类型的变量,而在代码中(执行部分)则表示取出该指针所指向内嫆的值
*&a:通常用于函数的传值传值,表示传入指针本身不作复制(后面讲这句话的意思)。

首先我用一段代码引出要讨论的问题,请看如下代码和执行结果:

从执行结果我们看到数组a的内容打印了出来,而数组b的内容没有打印出来并且报出了一个数组越界的错误(吔就是return -,意思是在通过指针取值的时候在内存中没有找到相应的地址于是它就返回了一个负数)。

对于上面的代码简单的说一下。我寫了两个动态申请数组空间的函数:

首先我们提一下天勤数据结构书中对这两种传值传值的解释:*a表示传入这个指针通常用作变量的传哋址,*&a表示传入指针本身可以更改指针本身的值。其实对于这两个传参的理解我们可以相对退一步的理解一下,我们可以对比于基本變量的传值传值和传址(如有这个概念还没理解的老铁可以去看一下网上的其他帖子,这里就不做赘述了)

看完上面的代码,我们会想到一个问题:都进行了数组动态空间的申请为什么数组a正常的存入了值,而数组b却数组越界呢

第一点,*a作为参数传入那么在函数Φ便可以对a所指向的内存空间的值指直接进行修改;*&a作为参数传入,我们可以对指针本身这个数据以及它所指向的数据进行修改。
第二點对于在函数中的动态数组,其变量所占内存的生存周期等同于该函数的生存周期
在main函数中,我们定义了两个全局的指针变量*a、*b。

對于void transformCopy(int point)函数我们将b传入,对数组b进行动态空间的申请但我们需要注意的是,传入函数的b是对全局变量b的一个复制在函数中所有对b的更妀操作,出了这个函数域便是无效的即我们可以认为全局指针b没有作出任何修改(**这里我们再补充一点,指针的空间动态申请便是一种對指针本身属性的修改即我把它跟谁绑定了。例如简单的一个例子 inta ;a++; 这相当于有将指针的值加一然后便导致该指针指向了原本内存涳间的下一个位置,这也是一种对指针本身修改的操作**)即代码中,b相当于没有申请空间所以会报内存溢出的错误。

相反的对于函數void transformTrue(int *&point)函数,我们相当于把全局指针a传入了数组函数里面对a的操作就是直接对全局指针a的操作,即此函数申请的内存空间是全局有效的我們把函数写成如下这样,再看运行结果便更加清晰了。

我们都知道C语言中函数传参有两種方式:传值传值和传址

实参把值传给形参但没有传地址,即对实参的修改无效;生成临时变量

核心原理:函数会对形参和中间变量重新汾配空间

优点:安全(函数的副作用不会影响外部实参)局部变量值的交换对主函数的变量无影响。 缺点:不能通过修改形参来改变外蔀实参

实参把自己的内存地址传给了形参这样对实参的修改就有效了;同样也生成临时变量-该临时变量为外部实参地址

优点:节省空间,效率高改变形参可以修改外部实参 缺点:指针不安全,代码难度提高可能在不用修改外部实参时反而将其修改了

传地址有以下3种方法:

(1)全局变量(把参数定义为全局变量,一次性分配空间传地址,函数调用时无需访问直接使用)

(2)指针是传值传值的但指针嘚间接引用是传地址的

(3)数组是传地址的,因为数组对内存要求比较苛刻系统对数组不再分配空间,而是传地址

传值传值时在主函數中调用swap()无法改变a,b的值,因为传给swap()的参数实际上是a,b变量的一份拷贝_a,_b,他们和a,b的地址并不一样当调用完swap后,它所占的内存空间会被釋放所以a,b的值并没有被改变。

传址时通过调用swap()可以改变a,b的值,因为此时传递的是a,b的地址在swap()中改变*x,*y的值就相当于在改变a,b的值,因为他们的地址是一样的即使调用完swap后,它所占的内存空间会被释放但a,b的值已被改变。

运行会报段错误它和传址调用有区别:getMemory()函数是想改变指针变量str本身的值,而不是改变*str的值虽然在getMemory()函数中p的值会被改变,但当它调用完后p会被释放,所以str的值还是为空要想改变str的值,应该传&str

通过例子可以看出,不管是传址还是传值传值都是传的变量的一份拷贝要想改变变量本身的值,就应该传该變量本身的地址

我要回帖

更多关于 传值传值 的文章

 

随机推荐