Loading

c++形参改变实参(对指针的理解

这几天搞逻辑比较晕,居然把指针的概念都混淆了。

eg:int *p;//当然不对指针初始化在有些编译器是通不过编译的,比如VS(尤其是选中了SDL)

指针p是一个对象,定义开始没有分配了内存空间,只是定义了一个指针而已。p存放的是对象的地址。

 1 #include<iostream>
 2 using namespace std;
 3 void main()
 4 {
 5     int *i = new int(0);
 6     cout << "调用前,i的地址:" << i << endl;
 7     int a = 9;
 8     i = &a;
 9     cout << "调用后,i的地址:" << i << endl;
10     cout << "调用后,i指向的值:" << *i << endl;
11     int b = 8;
12     *i = b;
13     cout << "调用后2,i的地址:" << i << endl;
14     cout << "调用后2,i指向的值:" << *i << endl;
15 }

可见取地址运算符&改变了指针i的地址,使i指向a。解引用*,*i就是i存放地址的值。

由于作业设涉及到用形参改变实参,特意的再探指针定义。

下面看例子:

1.使用指针形参

正确代码:

 1 #include<iostream>
 2 using namespace std;
 3 class test
 4 {
 5     int a;
 6 public:
 7     test(int n) :a(n) {}
 8     void get(int* p) { *p = a; }//形参指向a的地址
 9 };
10 void main()
11 {
12     test Q(2);
13     int *i = new int(3);
14     cout << "调用前,i的地址:" << i << endl;
15     Q.get(i);
16     cout << "调用后,i的地址:" << i << endl;
17     cout << "调用后,i指向的值:" << *i << endl;
18 }

不改变i的地址。

首先先明确一个问题。就是指针在定义时和使用时是不一样的。eg:int a=0;

定义时是int*p=&a;定义后再次赋值是 p=&a;

然后类比指针形参。

void get(int *p),你要传进来的是一个指针,某个变量的地址也就是说,是一个值。

所以当函数内部对同为地址(类型相同)的变量进行操作时,通过形参不能改变实参。

而,如果语句块中写的是{*p=exp;}时,情况就不一样了。你要改变这个地址存放的数据了。

 

 

错误代码:

(1)

 1 #include<iostream>
 2 using namespace std;
 3 class test
 4 {
 5     int a;
 6 public:
 7     test(int n) :a(n) {}
 8     void get(int* p) { p = &a; }//形参指向a的地址
 9 };
10 void main()
11 {
12     test Q(2);
13     int *i = new int(3);
14     cout << "调用前,i的地址:" << i << endl;
15     Q.get(i);
16     cout << "调用后,i的地址:" << i << endl;
17     cout << "调用后,i指向的值:"<<*i << endl;
18 }

可见并没有成功,i的地址没有变化,值也没有变化为初始值3,不是2.

*p看作一个整体,不然与值传递无异。 

(2)

 

 1 #include<iostream>
 2 using namespace std;
 3 class test
 4 {
 5     int a;
 6 public:
 7     test(int n) :a(n) {}
 8     void get(int* p) { p = &a; }//形参指向a的地址
 9 };
10 void main()
11 {
12     test Q(2);
13     int i=0;
14     cout << "调用前,i的值:" << i << endl;
15     Q.get(&i);
16     cout << "调用后,i的值:" << i << endl;
17 }

 

这个程序的意思是,i和Q.a共用一个地址。

2.使用引用形参

 这个例子比较简单,也好理解。就不放了。

 

总而言之,就是太过于形式化,不肯深入思考,探究清楚定义概念问题。

posted @ 2016-04-15 16:28  ArkiWang  阅读(2508)  评论(0编辑  收藏  举报