函数
来源:互联网 发布: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 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
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- 函数
- IBM PVM Study之--IBM PVM技术概述
- Oracle Study之--ORA-12537(TNS:connection closed) 错误案例
- angular-ui/bootstrap
- Oracle Study之--Oracle RAC重建控制文件
- 将博客搬至CSDN
- 函数
- 题目1088:剩下的树
- RESTful Web Services那点事
- 2015-03-31-C#@里 2个双引号表示一个双引号
- Runtime.getRuntime().exec(...)使用方法
- LeetCode算法题之Anagrams
- 关于JAVA的网络功能的略说
- 能力成长模型
- 小技巧:Parallels Desktop 的中统一mac和Linux 虚拟机的拷贝粘贴为 cmd+c cmd+v