“21好习惯“第一期-12


形式参数与实际参数
传值:每一个函数是有它自己的变量空间,参数也位于这个独立的空间中,和其他 的函数没有关系。对于函数参数表中的参数,叫做形式参数,调用函数时给的值,叫做实际参数

正是因为我们这种古老的方式来称呼实际参数,导致我们容易误会这个实际参数就是进入到函数内部实际参加预算的参数,而事实上,我们调用函数的时候不是传递进去变量,而是传递进去值了
C语言中都是传值。正确的理解方式:是参数与值的关系。

6.3.3本地变量(局部变量、自动变量)
本地变量是指在函数每次运行中产生的变量空间中的变量,而不是主函数里面所声明的变量

函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量,是函数的这次运行所独有的,成为本地变量
定义在函数内部的变量就是本地变量
参数也是本地变量。和本地变量具有一样的生存期和作用域
自动:生存期是自动的

生存期&作用域
生存期:开始到消亡
作用域:在代码的什么范围内可以访问这个变量
对于本地变量,这两个问题的答案是同一的:大括号内——块

Main里面声明的变量的作用域不包括自己定义的函数大括号之中

main函数有自己的变量空间;我们定义的函数也有自己的变量空间

本地变量的规则
本地变量是定义在块内的(就是大括号)
可以是函数,也可以是语句
甚至可以直接随便拉一对大括号来定义变量

程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就消失了
在块外面定义的变量在块里面仍然有效
块里面定义了和外面同名的变量时,则里面的变量掩盖了外面的变量(Java不是这样)
不能在同一个块里面定义同名的变量
本地变量不会被默认初始化
参数在进入函数的时候会被初始化

6.3.4函数细节

当函数没有参数时
void f(void) or
void f(): ?
在传统C上,第一种表示没有参数;第二种表示参数未知,但并不表示没有参数
C99中编译不出错,但是传递的值可能会出错

12行编译器认为要两个int的传递;
但是25行我们要两个double,这两个整数传递到double那里去,就出错了
在这里插入图片描述
C语言不允许函数的嵌套定义
Return (i):
圆括号没有任何意义;其实仍然是返回i的值,易发生误解
在这里插入图片描述

6.4二维数组
6.4.1二维数组

int a[3] [5];
1
通常理解为3行5列的矩阵

二维数组的遍历

for(i=0;i<3;i++)
{
for(j=o;j<5;j++)
{
a[i][j]=i*j;
}
}

a[i,j]表达的即为a[j]

int a[][5]=
{
{0,1,2,3,4},
{2,3,4,5,6},
};

二维数组的初始化
列数必须给出,行数可以由编译器来数
每一行一个{},逗号分隔
最后的逗号可以存在,有古老的传统
如果省略,表示补零
也可以用定位(* C99 ONLY),一连串数字也可
二维数组在内存中的排列是连续依次的,里面也可以不带大括号
在这里插入图片描述

const int size=3;
int board[size][size];
int i,j;
int numofx;
int numofo;
int result=-1;//-1没人赢;1 x赢;0 o赢
//读入矩阵
for(i=0;i<size;i++){
for(j=0;j<size;j++){
scanf("%d",&board[i][j]);
}
}
//检查行
for(i=0;i<size&&result==-1;i++){
numofo=numofx=0;
for(j=0;j<size;j++){
if(board[i][j]==1)
numofx++;
}else{
numofo++;
}
}
if(numofo==size){
result=0;
}else if(numofx==size){
result=1;
}
}
//检查列
if(result==-1){
for(j=0;j<size&&result==-1;j++){
numofo=numofx=0;
for(i=0;i<size;i++){
if(board[i][j]==1)
numofx++;
}else{
numofo++;
}
}
if(numofo==size){
result=0;
}else if(numofx==size){
result=1;
}
}
}
//检查对角线
numofo=numofx=0;
for(i=0;i<size;i++){
if(board[i][i]==1){
numofx++;
}else{
numofo++;
}
}
if(numofo==size){
result=0;
}else if(num0fx==size){
result=1;
numofo=numofx=0;
for(i=0;i<size;i++){
if(board[i][size-i-1]==1){
numofx++;
}else{
numofo++;
}
}
怎么对一行遍历
怎么对一列遍历
怎么判断对角线
这是二维数组里经常做的事情

int check(int i, int j)
{
    int result;
    for (i = 0; i < sizeip>
    {
        numofo = 0;
        numofx = 0;
        for (j = 0; j < sizejp>
        {
            if (board[i][j] == 1)
                numofx++;
            else
                numofo++;
        }
        if (numofo == size)
            result = 0;
        else if (numofx == size)
            result = 1;
    }
    return result;
}
作业:#include<stdio.h>
#include<math.h>
int main()
{
   int a,b,c,d;
   scanf("%d%d",&a,&b);
   if(b%2==0){
   c=0;}
   else{
   c=1;}
   d=a*pow(2,b/2);
   printf("%d %d",c,d);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值