ある有名な会社の2015夏休みの実習募集の試験問題と関連内容の復習

6499 ワード

1)以下の結果を出力する
<pre name="code" class="cpp">#include <iostream>
using namespace std;


int main(int argc, char *argv[])
{
	int **a[5][4];
        int *b[5][4];
	int *c[5];
	int d[5][4];
	char *e="helloworld";
	char g[]="0123456789";
	char f[20]="helloworld";
	cout<<sizeof(a)<<endl;
	cout<<sizeof(b)<<endl;
	cout<<sizeof(c)<<endl;
	cout<<sizeof(d)<<endl;
	cout<<sizeof(e)<<endl;
	cout<<sizeof(g)<<endl;
	cout<<sizeof(f)<<endl;
	return 0;
}
 答案: 
 
80
80
20
80
4
11
20
       . . .

解析:最初の3つの配列はすべてポインタ配列で、保存されているのはポインタで、ポインタの大きさはどんなタイプでも4バイトなので、その大きさは4*number(配列)です.後ろのsizeof(g)は11文字で、もう1つの'0'.したがって、サイズは11である.
また、このタイプの問題は、ポインタを頻繁に考察するほか、クラスや構造体の大きさについてもよく考察します.メモリの位置合わせに関連しているので、ブログを参照してください.http://www.cnblogs.com/longlybits/articles/2385343.html
2.)int**p=NULLを定義し、2 Dを動的に割り当てる方法
配列p[m][n]と解放
分析:
本題は事前にpが与えられているため、配列を使用して2次元配列を割り当てる必要があります.そうしないと、vectorを使用して2次元配列を割り当てることを強くお勧めします.vectorを使用するメリットは多く、動的な配列のサイズをいつでも変更でき、手動でメモリを解放する必要がないなど、ブログを参照してください.http://blog.csdn.net/zsuguangh/article/details/6135529
次に、配列を使用してクラスに2 D配列を割り当てます.
方法は2つあります.ブログを参照してください.http://blog.csdn.net/lavorange/article/details/42879605
一、二次元配列の動的配分(メモリ不連続)
//  p[m][n]
	int **p=new int *[m];
	for (int i=0;i<m;i++)
	{
		p[i]=new int[n];
	}
	//   
	for (int i=0;i<m;i++)
	{
		
		memset(p[i],0,sizeof(int)*n);
	}
   //    
	for (int i=0;i<m;i++)
	{
      delete[] p[i];
	  p[i]=0;//            0,          
	}
	delete[] p;
	p=0;

808020804
二次元配列の動的割り当て(メモリ連続)
//  p[m][n]
     int **p=new int *[m];
	 p[0]=new int[m*n];
	 for (int i=1;i<m;i++)
	 {
		 p[i]=p[i-1]+n;
	 }
//   
	 memset(p[0],0,sizeof(int)*n*m);
  //    
    delete[] p[0];
    p[0]=0;
	delete[] p;
	p=0;

3.)スタックとスタックの違いを述べる
参考答案:
1.スタックの空間はオペレーティングシステムによって自動的に割り当てられ、解放され、スタックの空間は手動で割り当てられ、解放される.
2.スタックのスペースは限られており、スタックは大きな自由記憶領域である.
3.cのmalloc関数に割り当てられたメモリ空間はスタック上にあり、C++にはnewオペレータが対応している.
4.プログラムはコンパイル期間中に変数と関数の割り当てメモリをスタック上で行い、プログラムの実行中に関数呼び出し時にパラメータ伝達もスタック上で行う.
4).グローバル静的変数とグローバル変数の違い,局所静的変数と局所変数の違い,静的関数と非静的関数の違いを述べる
参考答案:http://www.cnblogs.com/chenglei/archive/2009/09/06/1561367.html
http://blog.sina.com.cn/s/blog_9d38f2eb01010f76.html
C++変数は定義された位置によって異なる役割ドメインを持ち、役割ドメインは6種類に分けられる:グローバル役割ドメイン、ローカル役割ドメイン、文役割ドメイン、クラス役割ドメイン、命名役割ドメインとファイル役割ドメイン.
役割ドメインから見ると:
グローバル変数にはグローバルな役割ドメインがあります.グローバル変数は、1つのソースファイルで定義するだけで、すべてのソースファイルに作用します.もちろん、グローバル変数定義を含まない他のソースファイルでは、externキーでグローバル変数を再宣言する必要があります.
静的ローカル変数にはローカル役割ドメインがあります.これは1回のみ初期化され、最初の初期化からプログラムの実行が終了するまで存在し、グローバル変数との違いは、グローバル変数がすべての関数に対して可視であり、静的ローカル変数は定義された自分の関数体に対してのみ常に可視であることである.
ローカル変数もローカル役割ドメインのみで、彼は自動オブジェクトで、彼はプログラムの実行中にずっと存在するのではなく、関数の実行中にのみ存在し、関数の1回の呼び出しが終了すると、変数は取り消され、その使用したメモリも回収されます.
静的グローバル変数にもグローバル役割ドメインがあり、彼とグローバル変数の違いは、プログラムが複数のファイルを含む場合、彼はそのファイルを定義するのに役立ち、他のファイルには作用しない、すなわちstaticキーワードで修飾された変数がファイル役割ドメインを持つことである.これにより、2つの異なるソースファイルが同じ静的グローバル変数を定義しても、異なる変数になります.
メモリ領域の割り当てから見ると、次のようになります.
グローバル変数、静的ローカル変数、静的グローバル変数は、静的ストレージ領域に空間を割り当て、ローカル変数はスタックに空間を割り当てます.
グローバル変数自体が静的記憶方式であり、静的グローバル変数ももちろん静的記憶方式である.どちらもストレージ方式に違いはありません.違いは、非静的グローバル変数の役割ドメインがソースプログラム全体であり、1つのソースプログラムが複数のソースファイルから構成されている場合、非静的グローバル変数は各ソースファイルで有効であることです.静的グローバル変数は、変数を定義するソースファイル内でのみ有効であり、同じソースプログラムの他のソースファイルでは使用できない役割ドメインを制限します.静的グローバル変数の役割ドメインは1つのソースファイルに限られているため、そのソースファイル内の関数にのみ共通であるため、他のソースファイルでエラーが発生することを回避できます.
1、静的変数はプログラムの静的データ格納領域に格納され、次の呼び出し時に元の付与値を維持することができる.スタック変数とスタック変数の違いです
2、変数はstaticでコンパイラに知らせ、自分は変数の役割ドメインの範囲内でしか見えない.この点は彼とグローバル変数の違いです.
以上の解析から,局所変数を静的変数に変更すると,彼の記憶方式,すなわち生存期間が変化することが分かった.グローバル変数を静的変数に変更すると、彼の役割ドメインが変更され、彼の使用範囲が制限されるため、staticという説明子は異なる場所で異なる役割を果たす.
TIPS:
1.グローバル変数が単一のファイルにのみアクセスされる場合、この変数は静的グローバル変数に変更されると言えます.
2.グローバル変数が単一の関数でのみ使用される場合、この変数をその関数の静的ローカル変数に変更できます.
3、グローバル変数、静的ローカル変数、静的グローバル変数は静的データ記憶領域に格納される.
4、関数でstatic変数を使用する必要がある場合:ある関数の戻り値がポインタタイプの場合、staticのローカル変数のアドレスを戻り値とし、autoタイプの場合、エラーポインタとして返さなければならない.
5).クラスの順方向宣言はどのような役割を果たしますか?
参考ブログ:http://blog.csdn.net/yunyun1886358/article/details/5672574
http://blog.csdn.net/fg2006/article/details/6234973 http://qimo601.iteye.com/blog/1406992
主に1つのクラスの宣言で別のクラスの定義が必要な場合に使用されますが、この場合、クラスのサイズやメンバーの操作などの情報を知る必要はありません.これが1つのクラスであることを知る必要がある場合は、前の宣言でコンパイラにクラスであることを伝えることができます.aクラスが宣言時にbクラスのオブジェクトを定義するなど、2つのクラスが互いに含まれる場合によく使用されます.一方、bクラスが宣言中にaクラスの参照またはポインタを定義した場合、bクラスが宣言する必要がある場合、aクラスの参照またはポインタであり、サイズは固定されており、aクラスのサイズやメンバーの操作などの情報を知る必要はないため、aの前置き宣言(class a)をすればよい.
6).オブジェクト向けのプログラミングの理解について
          :         ,          ,             。                  ,       。        ,                   。              ,                            。
http://www.cnblogs.com/supers/articles/1229078.html
7).         

: , 。 , 。

: ( ), 。 , , 。 , “ ”。

: http://blog.csdn.net/f81892461/article/details/8648122
http://www.cnblogs.com/CareySon/archive/2012/04/14/Process-SynAndmutex.html
 
 
8)   :
 1 n    ,     {1,3,4}   ,        ,          ? 
これはゲーム理論の問題で、参考にすることができます
http://www.cnblogs.com/frog112111/p/3199780.html
http://blog.csdn.net/acm_cxlove/article/details/7854530
808020804