函数

函数和#define的区别

函数和#define都在main函数之外编写 都在main函数之内使用 区别在于

当程序执行到函数调用时 跳转到函数内部继续执行函数内部的语句 执行完后回到调用函数的位置 继续执行下面的语句

当程序遇到#define时 自动进行文本替换 这些操作是在程序开始之前执行完的 通常#define只包括常量 表达式 另外一预定义 #define中一般不带分号 因为#define其实质是文本替换

当然闲的无聊时也可以拿#define来实现类似函数的功能 如下

void func(void)
{
    int i,j;
    for (i=1; i<=5; ++i) {
        for (j=1; j<=i; ++j) {
            printf("*");
        }
        printf("\n");
    }
}

*
**
***
****
*****

函数作用是打印这样一个三角形 用#define实现 如下

#define FUNC int i,j;\
for (i=1; i<=5; ++i) {\
    for (j=1; j<=i; ++j) {\
        printf("*");\
    }\
    printf("\n");\
}

这样当程序遇到#define时 自动替换FUNC后面的代码 也可以完成上面一个函数的功能 但是这里需要注意的是 func()函数在这里可以使用多次 FUNC只能使用一次 因为与函数的不同之处在于 #define是文本替换 而不是跳转到相应函数执行 函数的变量是局部的 而#define的变量是全局的 所以修改一下 把定义变量这一步去掉 增加参数 把定义变量交给主函数 参数随着变量变化即可 如下

#define FUNC(i,j) \
for (i=1; i<=5; ++i) {\
    for (j=1; j<=i; ++j) {\
        printf("*");\
    }\
    printf("\n");\
}

这样就可以使用多次FUNC了

关于函数

1、函数不能返回局部变量的地址 因为函数的栈随着函数调用完而释放 局部变量的地址变得无意义

2、一维数组可以不声明数组元素的个数 二维数组行数可以不声明 但是列数必须声明

//int *wrong(void);
int *room(int *,int *);
void printArray(const int *);
void changeArray(int *);
int min(int [],int);
int max(int [][5],int);
//int *wrong(void)
//{
//    int a=100;
//    return &a;
//}

int *room(int *a,int *b)
{
    int temp=*a;
    *a=*b;
    *b=temp;
    return a;
}

void printArray(const int *a)
{
    int i;
    for (i=0; i<5; ++i) {
        NSLog(@"%i",a[i]);
    }
}

void changeArray(int *a)
{
    int i;
    for (i=0; i<5; ++i) {
        scanf("%i",a+i);
    }
}

int min(int a[],int n)
{
    int value,i;
    value=a[0];
    for (i=1; i<n; ++i) {
        if (value>a[i]) {
            value=a[i];
        }
    }
    return value;
}

int max(int a[][5],int n)
{
    int value,i,j;
    value=a[0][0];
    for (i=0; i<n; ++i) {
        if (i==0) {
            for (j=1; j<5; ++j) {
                if (value<a[0][j]) {
                    value=a[0][j];
                }
            }
        }
        else {
            for (j=0; j<5; ++j) {
                if (value<a[i][j]) {
                    value=a[i][j];
                }
            }
        }
    }
    return value;
}
//        NSLog(@"%p",wrong());
//        NSLog(@"%i",*wrong());
//        int *p=wrong();
//        NSLog(@"%p",p);
//        NSLog(@"%i",*p);
        
        int a=1,b=2;
        printf("a=%i b=%i\n",a,b);
        room(&a, &b);
        printf("a=%i b=%i\n",a,b);
        
        int c[5]={0,1,2,3,4};
        printArray(c);
        
        int d[5]={};
        changeArray(d);
        printArray(d);
        
        int e[]={24,1,3,15,23};
        NSLog(@"%i",min(e, 5));
        
        int f[][5]={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19},{20,21,22,23,24}};
        NSLog(@"%i",max(f, 5));

a=1 b=2

a=2 b=1

2015-04-09 11:23:41.483 Function[562:303] 0

2015-04-09 11:23:41.484 Function[562:303] 1

2015-04-09 11:23:41.484 Function[562:303] 2

2015-04-09 11:23:41.485 Function[562:303] 3

2015-04-09 11:23:41.486 Function[562:303] 4

5 6 7 8 9

2015-04-09 11:23:44.751 Function[562:303] 5

2015-04-09 11:23:44.752 Function[562:303] 6

2015-04-09 11:23:44.753 Function[562:303] 7

2015-04-09 11:23:44.754 Function[562:303] 8

2015-04-09 11:23:44.755 Function[562:303] 9

2015-04-09 11:23:44.756 Function[562:303] 1

2015-04-09 11:23:44.757 Function[562:303] 24

函数求二维数组的最大值 这里注意把a[0][0]赋值给value之后 当i==0的时候j是从1开始 当i!=0的时候j还得是从0开始 所以这里写的复杂一些 但是思路清楚


版权声明:本文为kobebryant16原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>