首页
登录 | 注册

C语言函数参数传递

1.值传递

void swap(int x,int y)
{
    int temp = x;
    x = y;
    y = temp;
}

void main()
{  
    int a = 10, b = 20;

    swap(a, b);
} 

执行后,并不会交换。

2.引用传递

void swap(int &x,int &y)
{
    int temp = x;
    x = y;
    y = temp;
}

void main()
{  
    int a = 10, b = 20;

    swap(a, b);
    printf("a=%d\nb=%d\n", a, b);
} 

执行后,发生交换。

3.指针传递

 
void swap(int *x,int *y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

void main()
{  
    int a = 10, b = 20;


    swap(&a, &b);
    printf("a=%d\nb=%d\n", a, b);
} 

执行后,发生交换。

4.数组做参数,传的到底是什么?

  参数传递只有上面三种,但是如果加上数组,就会产生几种新形式。 

  首先,明确数组型变量名本身只是该数组所占存储空间的首地址:

    int a[3] = { 1, 2, 3 };

    int *p = a; //等价于下行
    //int *p = &a[0];

    printf("%d", *p);    

   》》》典型的数组做参数

void fun(char s[]){
    for (int i = 0; s[i] != '\0'; i++)
        printf("%c", s[i]);
}
void main()
{
    char str[] = "Hello World!";

    fun(str);
}

  函数调用时,这里系统不会为形参分配数组存储空间,而是仅仅分配一个存放数组地址(第一个元素地址)的存储空间,此后,将实参数组的首地址传递给形参变量。其实本质与下相同,只不过还是数组形式的(数组名代替指针)。

  》》》既然数组型变量名本身只是该数组所占存储空间的首地址,我们当然可以用指针做形参来接收数组实参

 
void fun(char *p){
    while (*p)
    {
        printf("%c", *p);
        p++;
    }    
}
void main()
{
    char str[] = "Hello World!";

    fun(str);
}

  不过问题是如果这样,无法把握数组结束(除非知道数组长度)。而对于字符数组(上例),由于字符串末尾有结束标志'\0'(ascii码正好是0),所以就很容易利用指针来判断字符串是否结束。


相关文章

  • 前言:最近一直在刷leetcode的题,用到isalnum函数,用man手册查找了一下,总共有13个相关函数如下: #include <ctype.h> int isalnum(int c); int isalpha(int c ...
  • numpy C语言源代码调试(一)
    近期学习numpy,希望了解numpy内部实现机制,尝试调试numpy的源代码,特别是其中的C语言源码. 在numpy的官方网站上,有numpy的开发人员手册: https://docs.scipy.org/doc/numpy/dev/ 通 ...
  • 定义函数时,默认参数必须指向不变的对象 参数为可变对象时,正常调用的时候,结果没有问题,但是当使用默认参数的时候,结果就会和理想的有差距. In [78]: def add(L=[]): ...: L.append('END') ...: ...
  • 详解linux进程间通信-管道 popen函数 dup2函数
    前言:进程之间交换信息的唯一方法是经由f o r k或e x e c传送打开文件,或通过文件系统.本章将说明进程之间相互通信的其他技术—I P C(InterProcess Communication).今天将介绍半双工的管道. 一.匿名管 ...
  • 前言:今天在做一个小项目时,客户要求的xml,跟现在有系统要求的不一样,所以要自己重新写函数支持返回,进行简单总结,希望对大家有所帮助. 首先,使用xml函数需要链上动态库libxml2,需要在电脑上安装libxml的开发包,安装方法如下: ...
  • 目录 什么是闭包?(掌握) 两种为函数传参的方式 闭包函数的应用(掌握) 回顾: 函数对象:可以将定义在函数内的函数返回到全局使用,从而打破函数的层级限制. 名称空间与作用域:作用域关系在函数定义阶段时就已经固定死了,与调用位置无关,即在任 ...

2020 cecdns.com webmaster#cecdns.com
12 q. 0.081 s.
京ICP备10005923号