创建一个Car类,再利用Car类创建对象,代码如下:
1 #import <Foundation/Foundation.h>
2 @interface Car : NSObject
3 {
4 //成员变量
5 @public
6 int _wheels;
7 int _speed;
8 }
9 - (void)run;
10 @end
11
12 @implementation Car
13 - (void)run
14 {
15 NSLog(@"%d个轮子,速度为%ikm/h的车子跑起来", _wheels, _speed);
16 }
17 @end
18 int main(int argc, const char * argv[])
19 {
20 Car *car1 = [Car new];
21 car1 -> _wheels = 4;
22 car1 -> _speed = 250;
23
24 [car1 run];
25 return 0;
26 }
上面的代码输出结果为:4个轮子,速度为250km/h的车子跑起来了
下面我们我们在上面的代码中加入函数,来分析输出结果会有什么变化:
1、加入3个函数:test、test1、test2
1 void test(int w, int s) 2 { 3 w = 20; 4 s = 200; 5 } 6 7 void test1(Car *newCar) 8 { 9 newCar -> _wheels = 5; 10 } 11 12 void test2(Car *newCar) 13 { 14 Car *car2 = [Car new]; 15 car2 -> _wheels = 5; 16 car2 -> _speed = 300; 17 newCar = car2; 18 newCar -> _wheels = 6; 19 }
2、分析
(1)当main函数调用test函数的时候,实参_wheels = 4,_speed = 250传到test函数中,只是改变了w 和 s的值,属于值传递,函数内部不能改变外部的值,即并没有改变_wheels 和 _speed的值;所以输出结果是:4个轮子,速度为250km/h的车子跑起来了。
(2)car1调用test1函数,car1作为指针变量传递给test1函数,属于地址传递,函数内部可以改变外部的值。这时,test1函数中:car1 ->_wheels = 5, _wheels的值被改变。所以输出结果是:5个轮子,速度为250km/h的车子跑起来了。
(3)test2函数,函数的形参是一个Car类的指针变量。在这个函数中,又利用Car类创建了一个新对象,并把新对象的地址赋值给了car2,这时car2指向新对象;接下来car2对新对象的成员变量进行赋值。
当car1调用test2函数的时候,执行第17行代码,结果为:car1 = car2,改变了car1的指向,即car1也指向了car2所指向的对象,然后car ->_wheels = 6,即给car2所指向的新对象赋值。自始至终没有对car1原来指向的对象进行赋值操作,输出结果为:4个轮子,速度为250km/h的车子跑起来了。
注:由于对象把地址赋值给了指针变量,我们习惯上就把这个指向对象的指针变量称为对象。
3、总结:
1>函数的存在不依赖于类;
2>值传递,函数内部不能改变外部的值;
3>地址传递,函数内部可以改变外部的值;
4>复习指针,加深理解。