C语言函数参数传递方式

C语言中函数的参数传递方式有两种:传值、传地址。

1.传值调用

在被调用函数中开辟出一个临时的内存空间,在主调用函数进入被调用函数前,会将实参进行拷贝,拷贝的数据放在该临时内存空间中,供被调用函数使用。当被调用函数返回时,该临时内存空间即被释放。

 1 #include<stdio.h>
 2
 3 int test_func(char *q)
 4 {
 5     long lAddr=&q;       // 被调用时,光标选中“&q”,显示结果(随机)为:0x002df7ac {0x013058b8 "world"},
 6     q="Hello";           // 即此时,q的地址“&q”为:0x002df7ac,而q本身指向:0x013058b8 "world",与实参p指向相同。
 7     return 0;             8 }
 9
10 void main(void)
11 {
12     char *p="world";
13     long lAddr=&p;       // 断点时选中“&p”,显示:0x002df88c {0x013058b8 "world"},
14     test_func(p);        // 即此时p的地址“&p”为:0x002df88c,而p本身指向:0x013058b8 "world"
15
16     printf("%s\n");      // 最终输出为“world”
17 }

2.传地址调用

把主调用函数中开辟的某个内存空间的(首)地址传递给被调用函数,被调用函数可以读写该内存空间。当被调用函数返回后,该内存空间仍然存在,主调用函数会继续使用它。

 1 #include<stdio.h>
 2
 3 int test_func(int *x,int *y)    // 被调用时, 光标选中“x”,显示(随机):0x0039f934 {3};选中“y”,显示:0x0039f928 {9}
 4 {
 5     int temp;
 6
 7     temp=*x;
 8     *x=*y;            // 这里,内存地址未发生变化,但其中的值进行了交换。
 9     *y=temp;
10
11     return 0;
12 }
13
14 int main(void)
15 {
16     int x=3;
17     int y=9;
18
19     printf("x=%d,y=%d\n",x,y);    // x=3,y=9
20     test_func(&x,&y);             // 断点时,光标选中“&x”,显示(随机):0x0039f934 {3};选中“&y”,显示:0x0039f928 {9}
21     printf("x=%d,y=%d\n",x,y);    // x=9,y=3
22
23     return 0;
24 }

http://zhidao.baidu.com/link?url=4BPJ44dGW_2ok9hDUWIOW9SRHhWpYXb7YTyBzuip8LzYgAFuHHEHeAgMn5JhgpgRkBXKXg6lmN4c5IesfDMv5K

时间: 2024-08-05 11:16:02

C语言函数参数传递方式的相关文章

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名

Swift 1.1语言函数参数的特殊情况本地参数名外部参数名 7.4  函数参数的特殊情况 声明定义有参函数时,为函数的每一个参数都定义了参数名称.根据参数名定义的形式不同,函数参数包括本地参数和外部参数名两种本文选自swift入门很简单. 7.4.1  本地参数名 本地参数名就是定义函数名时,在参数列表中所写的参数名,它只可以在函数主体内使用.如以下的一个代码片段,它定义了一个函数名为fun的函数,在此函数的参数列表中定义的就是本地参数名文选自swift入门很简单. func fun(star

函数参数传递方式详解

1. 函数参数传递方式之一:值传递 (1)值传递的一个错误认识 先看如下的一个问题: void Exchg1(int x, int y) /* 定义中的x,y变量被称为Exchg1函数的形式参数 */ { int tmp; tmp = x; x= y; y= tmp; printf("x = %d, y = %d.\n", x, y); } 问:你认为这个函数是在做什么呀? 答:好像是对参数x.y的值对调吧? 请往下看,我想利用这个函数来完成对a,b两个变量值的对调,程序如下: mai

Java函数参数传递方式详解

在阅读本文之前,根据自己的经验和理解,大家可以先思考并选择一下Java函数的参数传递方式: A. 是按值传递的? B. 按引用传递的? C. 部分按值部分按引用? 此处暂不宣布正确答案,我们通过一个简单的例子让大家自己找答案: 1. 先定义一个类型Value Java代码   public static class Value { private String value = "value"; public String getValue() { return value; } pub

C语言函数参数压栈顺序为何是从右到左?(从左向右的话,碰到printf的会陷入死循环)

上学期学习了汇编语言,并在操作系统实验中使用了汇编+C语言混合编程,中间也了解了一些C语言与汇编语言的对应关系. 由于汇编语言是底层的编程语言,各种函数参数都要直接控制栈进行存取,在混合编程中,要用汇编来调用C函数,当然就要知道参数的压栈情况了. 当知道C函数的参数压栈顺序是从右到左时,我觉得很奇怪,因为大多数情况下,人们的习惯是从左到右的,难不成设计者学咱们中国古代写字从右到左的习惯不成? 当时只是记下了这个规则而已,并没有去探究这其中的缘由,后来在实验中自己用汇编实现了printf和scan

C语言函数参数为空和void

C语言中函数参数的为空和用void标注他们的效果一样吗? #include <stdio.h>  2 //int add();  3 int add(void);  4 int main(void)  5 {  6     int i;  7     i = add(5 ,6);  8   9     printf("%d\n", i); 10     return 0; 11 } 12 int add(a ,b) 13 { 14     return a + b ; 15

C 语言函数参数只能传指针,不能传数组

今天被要求编写一个C/C++冒泡算法的程序,心想这还不是手到擒来的事儿,虽然最近都是用Javascript程序,很少写C/C++程序,但是好歹也用过那么多年的C语言: 首先想的是怎么让自己的代码看上去更高大上一点,怎么着也得能自动识别数组的长度吧:于是第一版程序如下,结果如下 看到结果,很是惊讶,为什么是2呢?看到后面我列出可执行文件的类型,应该知道,这个长度是指针的长度,64bit,刚好两个字节.说明sortof求得是指针的长度,而非数组的长度. 仔细想想,函数的参数只能传递指针,不能直接传递

C语言函数参数既做出参又做入参的代表

//使用fcntl对文件进行加锁 #include "stdio.h"#include "unistd.h"#include "fcntl.h" int main(){    int fd;    struct flock lk;    int r;    fd=open("a.txt", O_RDWR);    if (fd==-1)    {        fd=open("a.txt", O_RDWR

Java和C参数传递方式的比较

java中的形参是复制实参的一份拷贝(对于引用类型则是复制引用的拷贝,在栈中的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象.[Java只有值传递Java只有值传递Java只有值传递,重要的事情说3遍] 示例代码: public class ExchangeValue { public static void main(String[]

C语言中函数参数为什么是由右往左入栈的?

先通过一个小程序来看一看: #include void foo(int x, int y, int z) { printf("x = %d at [%X]n", x, &x); printf("y = %d at [%X]n", y, &y); printf("z = %d at [%X]n", z, &z); } int main(int argc, char *argv[]) { foo(100, 200, 300);