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),所以就很容易利用指针来判断字符串是否结束。

posted @ 2018-02-25 22:57  阿柒~  阅读(4950)  评论(0编辑  收藏  举报