1. 参数为数值,传参的三种方式

1.1. 1.按值传递

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
}
int main()
{
    int a = 2, b =3;
    swap(a, b);
    return 0;
}
优点:便于阅读

缺点:不能改变主函数中的值

1.2. 2.按指针传递

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main()
{
    int a = 2, b =3;
    swap(&a, &b);
    return 0;
}

优点:可以改变主函数的值,传参时不需要大量的复制

缺点:不易阅读,容易出错

1.3. 3.按别名传递

void swap(int &a, int &b)
{
    int temp = a;
    a = b;
    b = temp;
}
int main()
{
    int a = 2, b =3;
    swap(a, b);
    return 0;
}

优点:能改变主函数的值,易阅读,传参时不需要大量的复制

2. 参数为一维数组

传递数组的3种方式

1)void func(int a[]);

2)void func(int a[5]);

3)void func(int *a);

void func1(int a[], int n);
void func2(int a[5], int n);
void func3(int *a, int n);
int main()
{
    int a[10], i;
    for(i = 0; i < 10; i++)
        a[i] = i + 1;
    func1(a, 10);
    func2(a, 10);
    func3(a, 10);
    return 0;
}
void func1(int a[], int n)
{
    int i;
    for(i = 0; i < n; i++)
        cout<< a[i] << ' ' ;
    cout<<endl;
}
void func2(int a[5], int n)
{
    int i;
    for(i = 0; i < n; i++)
        cout<< a[i] << ' ' ;
    cout<<endl;
}
void func3(int *a, int n)
{
    int i;
    for(i = 0; i < n; i++)
        cout<< a[i] << ' ' ;
    cout<<endl;
}

输出:

1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10

3. 参数不确定

一个函数输入的参数个数不确定,可以使用类似“命令行参数”的方法实现,如下:

#include <stdio.h>
void proc(char **p);

int main()
{
    char s[124] = {0};
    char *str[10] = {0};

    gets(s);
    printf("s: %s \n",s );
    int i;
    int j = 0;
    str[0] = s;
    for(i = 0; s[i] != '\0'; i++)
    {
        if(s[i] == ' ')
        {
            j++;
            s[i] = '\0';
            str[j] = &s[i+1];
        }
    }

    proc(str);

    return 0;
}

void proc(char **p)
{
    int i = 0;
    while(1)
    {
        if(p[i] != NULL)
        {
            printf("%s \n", p[i]);
        }
        else
        {
            break;
        }
        i++;
    }
}

这个函数要注意的是:

str[j] = &s[i+1];让指针数组的某一项指向数组的某一项,s是在栈里面的,str[j] 指向的是一样栈的空间 ,现在把str传给另一个函数,栈的内容都没有了,proc怎么访问p的内容呢? 答: 栈是先入后出的 先入的肯定 还没有释放掉 ,mian函数调用 proc , proc都没有返回 mian的 栈 不可能被销毁,这个问题 是调用函数 用到了被调用函数的栈 内地址,被调用函数 用调用函数的 栈地址 肯定是安全的

results matching ""

    No results matching ""