函数、作用域、指针

1、函数(续)

实参与形参
    值传递:实参赋值给形参之后,形参在函数体内发生的变化,不会传回给实参
    个数的对应关系
    类型转换
        int result = power(10);
        NSLog(@"%d", result);

        int a = 10;
        plus(a);
        NSLog(@"in main a=%d", a);

        fa(1,2,3,4,5);//当无形参时,实参会被忽略掉
        //fb(1,2,3);//形参指定为void后,调用时不能有实参

        //add(10, 20, 30);//当有形参时,实参不能多
        //add(10);//也不能少
        result = add(3.14, 2.68);//当形参与实参的数据类型不一致时,以形参为准,进行转换
        NSLog(@"%d", result);
return:结束所在函数,赋值与跳转,return语句只能返回一个值,不能反回两个或两个以上的值
exit:结束整个程序
    switch (x) {
        case 1:
            NSLog(@"x==1");
            return;//结束所在函数的运行
        case 2:
            NSLog(@"x==2");
            break;//结束所在switch语句的运行
        case 3:
            NSLog(@"x==3");
            break;
        case 4:
            exit(0);//结束整个程序的运行
    }
递归:是一种特殊的函数调用方法,自己调用自己
#import <Foundation/Foundation.h>

long power(int x, int n)
{
    if (n == 1)
    {
        return x;
    }
    return x * power(x, n - 1);
}

int main()
{
    @autoreleasepool {
        NSLog(@"5^3=%ld", power(5, 3));
    }
    return 0;
}

2、作用域

变量其作用的范围
局部变量:定义在函数体内,或复合语句内的变量

#import <Foundation/Foundation.h>

void fa(int x)//形参x是一个局部变量
{
    x++;
    NSLog(@"in fa x=%d", x);

    //y = 100;//局部变量y的作用域是从定义行开始到函数体结束
    int y = 20;//定义在函数体内的变量也是局部变量
    if (y)
    {
        int a = 30;//定义在复合语句中的变量,也是局部变量,该变量仅在复合语句中起作用
        a += y;
    }
    //NSLog(@"%d", a);

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", i);
    }
    printf("\n");
    //printf("%d\n", i);//循环变量i是循环体内的局部变量

    {
        int b = 50;
        b++;
        int a[100];//局部数组
        a[0] = 12345;
    }
    //b++;
    //a[0] = 54321;
}

int main()
{
    @autoreleasepool {
        int x = 10;
        fa(x);
        NSLog(@"in main x=%d", x);
    }
    return 0;
}
全局变量:定义在函数体外的变量,尽量不要使用全局变量
#import <Foundation/Foundation.h>

int g1 = 10;//g1是一个全局变量
void fa()
{
    g1++;
    //g2++;//全局变量的作用域是从定义行开始计算的,到整个文件结束
}

int g2;//一个全局变量不初始化时,编译器将给它赋值为0

//全局变量与局部变量的关系
int abc = 100;
void fc()
{
    NSLog(@"%d", abc);
    int abc = 200;//当局部变量与全局变量同名时,全局变量不起作用
    NSLog(@"%d", abc);

    {
        int abc = 300;//程序只使用其所在作用域内定义的局部变量
        NSLog(@"%d", abc);
    }
    NSLog(@"%d", abc);
}

int main()
{
    @autoreleasepool {
        g1++;
        fa();
        NSLog(@"%d", g1);

        NSLog(@"%d", g2);

        fc();
    }
    return 0;
}

3、生命周期

从变量分配存储空间到存储空间被释放空间的时间
auto关键字(默认)
static关键字
延长局部变量的生命周期,到整个程序结束
static不会修改局部变量的作用域

#import <Foundation/Foundation.h>

void fa()
{
    int n = 1;
    NSLog(@"%d", n);
    n++;
}

void fb()
{
    static int n = 1;
    NSLog(@"%d", n);
    n++;
}

int main()
{
    @autoreleasepool {
        for (int i = 0; i < 5; i++)
        {
            //n = 10;
            fb();
        }
    }
    return 0;
}

4、指针

指针就是地址,地址就是自己在内存中的编号
指针变量:专门存储地址的变量,简称为指针
指向:指针变量p中保存另一个变量x的地址时,就说该指针变量指向该变量x
引用:使用指针操作(赋值、访问)其指向的变量

|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
解析:

#import <Foundation/Foundation.h>

int main()
{
    @autoreleasepool {
        int x = 100;
        int* px = &x;
        NSLog(@"%p", px);

        *px = 200;//指针px引用(赋值)变量x
        NSLog(@"%d", x);
        NSLog(@"%d", *px + 10);//引用(访问)

        char ch = 'a';
        char* pch = &ch;
        *pch = 'b';
        NSLog(@"%c", ch);

        float f = 3.14;
        float* pf = &f;
        *pf = 2.68;
        NSLog(@"%g", f);

        double d = 9.8;
        double *pd = &d;
        *pd = 4.5;
        NSLog(@"%lg", d);

        //下面两行等效
        int* p1;
        int *p2;

        int a1 = 10;
        p2 = &a1;
        int a2 = 20;
        p2 = &a2;//当对指针进行赋值时,相当于指针指向的改变
        *p2 = 30;//改变指针引用的空间
        NSLog(@"a1=%d,a2=%d", a1, a2);
    }
    return 0;
}

每日一练
1、打印如下图形
01
2、用函数简化打印程序

#import <Foundation/Foundation.h>

void printSpace(int num)
{
    for (int j = 0; j < num; j++)
    {
        printf(" ");
    }
}

void printStar(int num)
{
    for (int j = 0; j < num; j++)
    {
        printf("*");
    }
}

void printPic(int lineNum)
{
    for (int i = 0; i < lineNum; i++)
    {
        printSpace(lineNum - i - 1);
        printStar(2 * i + 1);
        printf("\n");
    }
}

void printPic1(int lineNum)
{
    for (int i = 0; i < lineNum - 1; i++)
    {
        printSpace(lineNum - i - 1);
        printStar(1);
        if (i > 0)
        {
            printSpace(2 * i - 1);
            printStar(1);
        }
        printf("\n");
    }
}

int main()
{
    @autoreleasepool {
        int n;
        NSLog(@"请输入行数:");
        scanf("%d", &n);
        printPic1(n);

    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值