半路转行IT,初学C++,用MFC帮哥们编一个专业上的绘图设计计算的软件时,参考微软给的几个示例源代码参考着在做。由于基础不好,老是被里面的指针和引用弄得有点头晕眼花。特别是函数的参数,有时候是指针,有时候是普通变量,有时候是引用,让人凌乱。于是写了一段小代码,初步测试一下。
测试方法:三个函数,分别是把一个整数变量i传递给自己的参数然后进行+1的操作。DoNumber1的参数是一个引用,DoNumber2的参数是整数变量,DoNumber3的参数是一个int*指针。第三个函数略有不同是拿 *number去+1。
运行结果:
The number is: 5
After method 1 the number becomes: 6
After method 2 the number becomes: 6
The address of the pointer is: 0113FC94
The int value the pointer points to is: 6
The address of the point is :0113FC94
The int value the pointer points to is: 7
After method 3 the number becomes: 7
结论:如果参数是引用,函数里对参数number的操作会改变原始变量i;如果参数是变量,则不会改变传递给参数的变量,估计这时候创建了一个新的变量获取了原始变量的值;如果参数是指针,对*number的操作也会改变原始参数i的值。
另类测试:把第三个函数中的"*number += 1"之前加一行:"number += 1",即把下述代码中注释掉的那行加入。
运行结果:
The number is: 5
After method 1 the number becomes: 6
After method 2 the number becomes: 6
The address of the pointer is: 00AFF964The int value the pointer points to is: 6
The address of the pointer is: 00AFF968
The int value the pointer points to is: -858993459
After method 3 the number becomes: 6
结论:由于number+=1把变量number的地址更改了,后面的*number +=1 已经不会修改到i的值。
困惑:为什么对地址+1,结果得到的新地址比原来的大4呢?在新的地址里的数字为什么是-858993459呢?在做那个另类测试时,当退出CMD框时,跳出来一个runtime error,"Run-Time Check Failure #2 - Stack around the variable i was corrupted",为什么呢,不过说明了一个问题,指针乱用会很危险。。等找到答案了再来更新。
插曲:作为一个初学者,毕竟土鳖,一开始没有在前面声明那三个函数,结果报错;然后,在用cout和endl的时候忘了namespace这茬了。。。
#include <iostream>
void DoNumber1(int& number);
void DoNumber2(int number);
void DoNumber3(int* number);
int main(void)
{
int i = 5;
std::cout<<"The number is: "<<i<<std::endl;
DoNumber1(i);
std::cout<<"After method 1 the number becomes: "<<i<<std::endl;
DoNumber2(i);
std::cout<<"After method 2 the number becomes: "<<i<<std::endl;
DoNumber3(&i);
std::cout<<"After method 3 the number becomes: "<<i<<std::endl;
system("pause");
return 0;
}
void DoNumber1(int& number)
{
number = number + 1;
}
void DoNumber2(int number)
{
number = number + 1;
}
void DoNumber3(int* number)
{
std::cout<<"The address of the pointer is: "<<number<<std::endl;
std::cout<<"The int value the pointer points to is: "<<*number<<std::endl;
//number += 1;
*number +=1;
std::cout<<"when the parameter is a pointer"<<number<<std::endl;
std::cout<<"The int value the pointer points to is: "<<*number<<std::endl; }