函数的参数传递

今天老师讲了函数的调用,也有一些收获。首先,函数的参数传递分为值传递,指针传递和引用传递三种,现阶段常用的是值传递和指针传递。

首先说一下值传递,这是一种仅仅传递变量的内容的传递方式,在子函数里不能对上一级函数中对应的变量产生影响,换句话说,子函数中接收到的变量实际上是上一级函数中变量的副本。该传递方式过于简单,不贴代码。
注:值得注意的是,传递二维数组时(见下),是指针传递,在函数内的操作会对上一级函数有影响。

//题目:编写函数判断一个n阶矩阵是否对称,若对称则返回1,不对称则返回0.
//主函数中定义矩阵并调用该函数进行判断。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
#define N 88
int judge(int a[][N],int n)
{
    for(int i=0;i<n;i++) for(int j=0;j<n;j++) if(a[i][j]!=a[j][i]) return 0;
    return 1;
}
int main()
{
    int n,a[N][N],i,j,k;
    printf("请输入矩阵阶数n:");
    scanf("%d",&n);
    cout<<"请输入矩阵数据:";
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            cin>>a[i][j];
        }
    }
    if(judge(a,n)) cout<<"矩阵关于主对角线对称\n";
    else cout<<"矩阵不对称\n";
    return 0;
}

然后说一下指针传递,上题的二维数组参数就是指针传递的一种,顾名思义,指针传递后,子函数内接收到的就是一个地址(又称地址变量),所以,上题的二维数组指针传递又可以写成:

int judge(int *a[N],int n);

从本质上看,[]和*在某些地方用法相同,可以互相替换。
但今天的刷题过程中我发现*的优先级低于++,在同时使用时需要加括号,值得注意。例子见下题:

//设计函数void check(char a[],int *numc,int *numn,int *nume, int *muno)
//用于统计字符串a中字母、数字、空格和其它字符的个数;设计主函数输入字符串并输出上述统计结果。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
void check(char a[], int *numc, int *numn, int *nume, int *muno);
int main()
{
    char a[10000];
    int space=0,num=0,lett=0,othe=0;
    cout<<"输入字符串,以换行符结束:";
    cin.getline(a,9999,'\n');
    check(a,&lett,&num,&space,&othe);
    printf("字母%d个\n数字%d个\n空格%d个\n其他%d个\n",lett,num,space,othe);
    return 0;
}
void check(char a[], int *numc, int *numn, int *nume, int *muno)
{
    for(int i=0;a[i]!='\0';i++)
    {
        if(a[i]==' ') (*nume)++;
        else if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')) (*numc)++;
        else if(a[i]>='0'&&a[i]<='9') (*numn)++;
        else (*muno)++;
    }
}

最后一种为引用传递(作用和指针没什么大的区别),就是形式有些不同。但引用传递传过来的是变量,且就是主函数中对应的变量,因此,对子函数中的变量修改会影响到主函数。

void cal(int &a,int &b)    //子函数声明
cal(x,y)      //主函数调用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的水面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值