函数、作用域、指针
来源:互联网 发布:js除以一个数取整 编辑:程序博客网 时间:2024/05/18 03:18
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;}
0 0
- 函数、作用域、指针
- 关于函数指针的作用域
- 函数重载与作用域,数组指针
- 函数指针的作用
- 函数指针的作用
- 指针函数的作用
- 函数指针的作用
- 函数指针作用
- C函数指针的作用
- 函数指针的好处、作用
- C指针 作用域
- 指针作用域
- C函数指针的偏门作用
- 函数指针的作用 (转载)
- 函数指针作参数的作用
- C语言函数指针的作用
- 函数指针作参数的作用
- C中函数指针的作用
- jquery checkBox undefined 和hibernate 联合主键的注意事项 集合转数组 数组转集合 map list 数组 判空 问题
- HttpURLConnection 解析
- Android逆向基础笔记—Dalvik字节码小记_const/4 v2, 0x1
- 导航栏
- 清理plug and play 和 Disk Controller
- 函数、作用域、指针
- Android Studio导入github项目
- Object 你可能不知道的“=”秘密
- UITabBarController详解
- 43. Spring Boot动态数据源(多数据源自动切换)【从零开始学Spring Boot】
- Mysql中limit的用法详解
- 残差金子塔区域块细节筛选融合
- PCIe memory base and memory limit
- 碎片复用