郭炜先生(北京大学)プログラム設計とアルゴリズム(三)第1週間検査問題

2970 ワード

xiti 001-1.1簡単なswap
/*
  ,         :5,3
*/
#include 
#include
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;
}

xiti 002-1.2少し難しいswap
/*
  ,         :
5,3
*/
using namespace std;

#include 
#include
/*
  :
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;
}

xiti 003-1.3奇妙な戻り値
/*  ,          
  : 
  :10
*/
#include 
#include
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;
}

xiti 004-1.4謎の配列初期化(解答詳細は以下の質問回答部分を参照)
/*  ,          
  : 
  :123,456
*/
#include 
#include
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]}二次元配列も作成できますよね?答え:そう!機能は2 D配列と同じです!ポインタ配列はまず1つの配列であり、この配列の各要素はポインタ変数であり、各ポインタ変数も1つの配列を指すことができるが、配列の要素は前の申請のタイプと一致しなければならない.このときaは2次元配列ポインタと見なすことができる.もし配列を指すならば、この配列のメモリはどのように申請するか、あるいは解放するかは開発者によって完全に決定される.自分で申請してもいいし、システムで申請してもいいです.どう使うか見てみましょう.これは動的にデータを割り当てて、自分で申請して必ず解放することを覚えておくことに注意します.newはスタックの上に置いて、使い終わったらdeleteを必要とします.彼の機能は2次元配列にそっくりですが、少し違います.スタックに割り当てると、newごとにスタックにスペースが割り当てられます.このメモリは連続しています.しかし、あなたはnewを3回もしました.これは3つのメモリです.実際には、必ずしも一緒にいるとは限りません.配列int a[3][6]の18要素は連続したアドレスであるが、あなたが申請したポインタ配列は、対応する各1次元配列int[6]のアドレスが連続しているとは限らない.あなたの方法で定義すると、各1次元配列のアドレスは連続的で、このいくつかの1次元配列の間のアドレスは連続的ではありません.動的に割り当てられているからです.
作者:liangwenhao 1108 CSDNアドレス:https://blog.csdn.net/liangwenhao1108マイクロブログアドレス:https://weibo.com/p/1005056474319128/wenzhangブログのアドレス:https://www.cnblogs.com/WHaoL/私达の精力と生命はすべて有限で、もし私のCSDNの文章の中に着くならば.皆さんの批判と指摘を歓迎します.一緒に進歩しましょう.本文はブロガーのオリジナル文章で、転載はブロガーのリンクを添付してください!