郭炜老师(北京大学)程序设计与算法(三)第1周检测题

xiti001-1.1简单的swap

/*
填空,使得程序输出结果是:5,3
*/
#include <iostream>
#include<cstdio>
using namespace std;
class A
{
public:
	int x;
	int getX() { return x; }
};
/*
传引用 ,那么调用形参a,也就是调用实参a
*/
void swap(A & a,A & b)
{
	int  tmp = a.x;
	a.x = b.x;
	b.x = tmp;
}
int main()
{
	A a,b;
	a.x = 3;
	b.x = 5;
	swap(a,b);
	cout << a.getX() << "," << b.getX();
	return 0;
}

xiti002-1.2难一点的swap

/*
填空,使得程序输出结果是:
5,3
*/
using namespace std;

#include <iostream>
#include<cstdio>
/*
解答:
int*&a拆分看:int*(&a),
int*说明&a整体代表一个指针,
然后因为&,说明a是一个引用。所以说a是一个指针的引用,
在swap函数中,交换了两个地址(因为是引用型,所以交换会影响到形参),所以交换成功

总结我的理解:
int a;
int & pa1 = a 
//& 说明pa1是个引用,是int型的引用--引用的是int型的变量,那么操作pa1也就是操作那个整形变量a
int * pa = &;
int * & pa2 = pa 
//& 说明pa2是个引用,引用的是(int *)型的变量pa,那么操作pa2也就是操作了那个整形指针变量pa
//那么,在这个函数中改变pa2里存的值,也就是改变了pa里存的值(也就是把整形指针变量pa指向的内容给改变了,以此达到交换目的)
*/
void swap(int *&pa2, int *&pb2)
{
	int * tmp = pa2;
	pa2 = pb2;
	pb2 = tmp;
}
int main()
{
	int a = 3,b = 5;
	int * pa = & a;
	int * pb = & b;
	swap(pa,pb);
	cout << *pa << "," << * pb;
	return 0;
}

xiti003-1.3好怪异的返回值

/*填空,使得程序输出指定结果
输入:无
输出:10
*/
#include <iostream>
#include<cstdio>
using namespace std;
/*
	1-函数返回值是个int型的引用,
	2-return 返回了int型的a[i]
		也就是函数返回值引用了整形变量a[i],
		对返回值赋值,也就是对引用的整形变量a[i]赋值,从而达到操作a[i]的效果
*/
int & getElement(int * a, int i)
{
	return a[i];
}
int main()
{
	int a[] = {1,2,3};
	getElement(a,1) = 10;
	cout << a[1] ;
	return 0;
}

xiti004-1.4神秘的数组初始化(解答详见下面的问题回答部分)

/*填空,使得程序输出指定结果
输入:无
输出:123,456
*/
#include <iostream>
#include<cstdio>
using namespace std;
int main()
{
	//用指针数组定义二维数组
	int * a[] = {0,0,new int[6],new int[6]};
	*a[2] = 123;
	a[3][5] = 456;
	if(! a[0] )
	{
		cout << * a[2] << "," << a[3][5];
	}
	return 0;
}

问题:用指针数组int*a[3] ;for(int i=0;i<3;i++){ a[i]=new int[6] }也可以创建二维数组啊 对么?
回答:
没错!功能跟二维数组一样!
指针数组首先是一个数组,这个数组中的每个元素都是指针变量,每个指针变量也可以指向一个数组,但数组的元素必须和前面申请的类型一致,此时a就可以看做是二维数组
指针如果再指向的是数组,这个数组的内存怎么申请或者释放完全由开发人员决定,你可以自己申请也可以系统帮你申请,看你要怎么用。
这是动态分配数据,注意自己申请一定要记得释放。new的放在堆上,用完后要delete
虽然他的功能跟二维数组一模一样,但是还是有些许差别的。在堆上分配,你每new一次,都会在堆上分配一次空间,这块内存是连续的。但是,你new了三次,这是三块内存,实际上,不一定会连续在一起。
数组int a[3][6]里面的18个元素是连续的地址,但是你申请的指针数组,所对应的每个一维数组int[6]的地址不一定是连续的。按你的方法定义,每个一维数组里的地址是连续的,这几个一维数组之间的地址不是连续的,因为是动态分配的。

作者 :liangwenhao1108
CSDN地址 :https://blog.csdn.net/liangwenhao1108
微博地址 :https://weibo.com/p/1005056474319128/wenzhang
博客园地址:https://www.cnblogs.com/WHaoL/
公众号地址:
版权声明 :我们的精力和生命都是有限的,复制代码的话,到我的CSDN文章里吧。欢迎大家批评指正,让我们一起进步吧!本文为博主原创文章,转载请附上博文链接!

发布了12 篇原创文章 · 获赞 10 · 访问量 7178

猜你喜欢

转载自blog.csdn.net/liangwenhao1108/article/details/89147261