OC-static和extern、递归、对象与函数参数的内存分配

 

一、static和extern关键字

1、static和extern对变量的作用
1>.外部变量:定义的变量能被本文件和其他文件访问(默认)
extern int a
默认情况下,不同文件中的外部变量代表同一个变量
2>.内部变量:定义的变量只能被本文件访问,不能被其他文件访问
static int a
默认不同情况下同名的内部变量互不影响
2、static对局部变量的作用
局部变量:函数一调用完,变量的存储空间就消失,下一次在调用的时候,
再一次分配存储空间。
static修饰局部变量:延迟局部变量的生命周期,程序结束,局部变量才被
销毁,但是并不会改变局部变量的作用域

#include<stdio.h>
void test(){
int a=0;a++;
printf("a的值是%d\n",a);

static int b=0;b++;
printf("b的值是%d\n",b);
}
int main(){
test();//a=0,b=1
test();//a=0,b=2
test();//a=0,b=3
return 0;
}
当一个函数内部被调用很多次,且其值不变,就可以定义为static int  b=3.14;
二、递归
1、设计一个函数计算b的n次方
#include<stdio.h>
//非递归算法
int pow1(int b,int n){
int result=1;//保存结果
for(int i=0,i<n,i++){
result *= b;
}
return result;
}
/*
//递归算法
int pow2(int b,int n){
if(n<=0) return 1;
return pow2(b,n-1)*b;
}
*/
int main(){
int c=pow1(2,5);
printf("%d\n",c);
ruturn 0;
}
三、OC简介(与C不同之处)
1、特点:完全兼容C语言、可以再OC中混入C语言代码甚至C++代码
2、关键字:大部分以@开头,例如@interface;还有不少不以@开头,例如 self super id _cmd _block _strong _weak
3、OC字符串以@开头,例如@"Hello"
4、nil相当于C中的NULL,值是0;
5、屏幕输出  NSLog(@"Hello");
6、C语言文件拓展名是.c;OC语言文件是.m
7、我的第一个OC程序
#include <stdio.h>
int main()
{// OC程序的入口
    printf("我的第1个OC程序\n");
    return 0;
}//可以看出几乎跟C语言程序一样,只是文件拓展名.m不同
8、看下面的程序
//#import <Foundation/NSobjCRuntime.h>
#import <Foundation/Foundation.h>//Foundation框架的主头文件名称就是Foundation.h
int main(){// NSLog输出内容会自动换行
NSLog(@"第2个OC程序!!!");
return 0;
}

1.#import的作用

 1> 跟#include一样,拷贝文件的内容
 2> 可以自动防止文件的内容被重复拷贝
2.主头文件
  1> 主头文件:最主要的头文件,名字一般跟框架名称一样,包含了框架中
的所有其他头文件,例如头文件Foundation/Foundation.h就包含了
Foundation/NSobjCRuntime.h
 2> 只需要包含Foundation框架主头文件,就可以使用整个框架的东
9、只要调用了Foundation框架就必须链接_framework Foundation
10、BOOL(YES\NO)类型
的所有其他头文件,例如头文件Foundation/Foundation.h就包含了
Foundation/NSobjCRuntime.h
 2> 只需要包含Foundation框架主头文件,就可以使用整个框架的东
9、只要调用了Foundation框架就必须链接_framework Foundation
10、BOOL(YES\NO)类型

四、面向对象

1、术语:面向对象编程Object Oriented Programming,简称OOP
2、类名的第一个字母必须大写,不能有下划线,用驼峰标识
3、类的声明和实现
1>.类的声明:声明对象的属性和行为
@interface Car :NSobject{//大括号用来声明对象属性(实例变量\成员变量,默认会初始化为0),:NSobject目的是让Car类具备创建对象的能力
@public//可以让外部的指针间接访问对象内部的成员变量
int wheel;//轮胎个数
int speed;//速度
}
@end//必须写end
2>.类的实现
@implementation Car
@end
#import <Foundation/Foundation.h>
int main(){//利用类来创建对象
//在OC中想执行一些行为,就写上一个中括号[行为执行者 行为名称]
[Car new];//执行了Car类的new行为来创建对象
Car *p = [Car new];
// 定义了一个指针变量p,p将来指向的是Car类型的对象
p->wheel = 2;// 给p所指向对象的wheel属性赋值
p->speed = 20;
NSLog(@"车子有%d个轮子,时速为:%dkm/h", p->wheel, p2->speed);
return 0;
}

方法:-(返回值)方法名;

-(void) run;//只要是OC对象的方法必须以-开头,任何数据类型必须用小括号括住
NSLog(@"车子跑起来了");
@end
调用[p run];
4、方法与成员变量

#import <Foundation/Foundation.h>
@interface Preson:NSobject{//类的声明
@public
int age;
double weight;
}
-(void) walk;//方法
@end
@inmplementation Preson//类的实现
-(void) walk{//实现在@interface中声明的方法
NSLog(@"%d岁、%f公斤的人走了一段路",age,weight);
}
@end

int main(){
Preson *p=[Preson new];
p->page=20;
p->weight=50.0
[p walk];//结果会输出20岁、50.0公斤的人走了一段路
return 0;
}

每个对象里面都有一个默认的isa指针,指向其对应的类,然后就能知道可


以调用类的那些方法
类:方法
对象:成员变量


5、对象与函数参数
#import <Foundation/Foundation.h>
@interface Car:NSobject{
//成员变量
	int wheels;
	int speed;
}
-(void)run;
@end

@implementation Car
-(void)run{
	NSLog(@"%d个轮子,速度为%dkm/h的车子跑起来了",wheels,speed);
}
@end

void test(int w,int s){
		w=20;
		s=200;
}

void test1(Car *newC){
	c->wheels=5;
}
int main(){
	Car *c=[Car new];
	c->wheels=4;
	c->speed=250;
	test(c->wheels,c->speed);
	test1(c);
	[c run];	
	return 0;
}
内存分配图如下: 


下边一段代码

void test2(Car *newC){
Car *c2=[Car new];//新建一个Car对象c2
c2->wheels=5;//c2对象的成员变量
c2->speed=300;

newC=c2;把c2的地址给了newC,newC的地址变为c2的地址,指向对象c2
newC->wheels=6;//改变c2的成员变量的值
}

int main(){
test2(c);
return 0;
}

内存分配图






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值