动手测试C++中指针与引用作为函数参数的行为

半路转行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: 00AFF964

The 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; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值