这几天搞逻辑比较晕,居然把指针的概念都混淆了。
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.使用引用形参
这个例子比较简单,也好理解。就不放了。
总而言之,就是太过于形式化,不肯深入思考,探究清楚定义概念问题。