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、打印如下图形
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;
}