函数

来源:互联网 发布:java数据源配置 编辑:程序博客网 时间:2024/06/14 01:12

函数和#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开始 所以这里写的复杂一些 但是思路清楚

0 0
原创粉丝点击