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