郭炜先生(北京大学)プログラム設計とアルゴリズム(三)第1週間検査問題
2970 ワード
xiti 001-1.1簡単なswap
xiti 002-1.2少し難しいswap
xiti 003-1.3奇妙な戻り値
xiti 004-1.4謎の配列初期化(解答詳細は以下の質問回答部分を参照)
質問:ポインタ配列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の文章の中に着くならば.皆さんの批判と指摘を歓迎します.一緒に進歩しましょう.本文はブロガーのオリジナル文章で、転載はブロガーのリンクを添付してください!
/*
, :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の文章の中に着くならば.皆さんの批判と指摘を歓迎します.一緒に進歩しましょう.本文はブロガーのオリジナル文章で、転載はブロガーのリンクを添付してください!