C/C++面接/筆記試験問題についての反省(超基礎的な知識点)


1、変数aで以下の定義を与える
a)、整数数; 
int a;

b)、整数を指すポインタ. 
int *a;

c)、ポインタを指すポインタであり、そのポインタは整数数を指す. 
int **a;

d)10個の整数型の配列がある. 
int a[10];

e)、10個のポインタを有する配列であって、このポインタは1つの整数数を指す. 
int *a[10];

f)10個の整数配列を指すポインタ. 
int (*a)[10];

g)、整数パラメータを有し、整数数を返す関数を指すポインタ. 
int (*a)(int);

h)、10個のポインタを有する配列であって、そのポインタは1つの関数を指し、この関数は1つの整数パラメータを有し、1つの整数数を返す.
int (*a[10])(int);

2、以下は32がwindowsの下のc++プログラムで、計算してください:
char str[]="hello";
char *p=str;

計算してください:
sizeof(str)
sizeof(p)
strlen(str)
strlen(p)

sizeof(str)=6 ;
sizeof(p)=4 ; strlen(str)=strlen(p)=5;
3、メモリの問題
(1)、メモリの割り当て方法とその違いは?
1つは、静的記憶領域からの割り当てです.メモリはプログラムのコンパイル時にすでに割り当てられており、この内にプログラムが存在する全実行期間が存在します.たとえば、グローバル変数とstatic変数です.
2つ目はスタックから作成します.スタック領域はコンパイラによって自動的に割り当てられて解放され、関数のパラメータ値、ローカル変数の値などが格納されます.
三つ目はスタックから動的に割り当てることです.一般的にはプログラマによってリリースが割り当てられますが、プログラマがリリースしないとエラーが発生する可能性があり、プログラムは終了時にOSによって回収されます.
(2)、new/deleteとmalloc/freeの違いと連絡は何ですか?
同じ点:両方ともスタック上で動的なメモリ操作を行います.
異なる点:malloc関数はメモリ割り当てのバイト数を指定し、オブジェクトを初期化できず、freeもオブジェクトの構造関数を呼び出すことはありません.しかしnewはオブジェクトのコンストラクション関数を自動的に呼び出し、deteleもオブジェクトのコンストラクション関数を自動的に呼び出します.
(3)、スタックオーバーフローの原因は何ですか?
可能な原因は、1つは、ループの再帰呼び出しによるものであり、ビッグデータ構造のローカル変数を使用すると、スタックオーバーフローを引き起こす可能性があります.第二に、ゴミ資源を回収していないと、メモリが漏れてシステムメモリが消費されます.
4、重要なキーワード
(1)、staticの用途
1つは変数を制限する役割ドメインである.2つ目は、変数のストレージドメインを設定することです.
具体的には以下の通りです.
1)、関数体において、静的と宣言された変数は、この関数が呼び出される過程でその値を一定に維持する.
2)、モジュール内(ただし、関数の体外)では、静的と宣言された変数は、モジュール内で使用される関数によってアクセスできますが、モジュール外の他の関数にはアクセスできません.ローカルのグローバル変数です.
3)モジュール内で、静的と宣言された1つの関数は、このモジュール内の他の関数によってのみ呼び出すことができる.すなわち、この関数は、宣言されたモジュールのローカル範囲内で使用されることに制限される.
(2)、キーワードvolatileの意味
よく知られているconstと同じように、volatileはタイプ修飾子(type specifier)です.これは、異なるスレッドによってアクセスおよび変更される変数を修飾するように設計されています.
volatileとして定義された変数は、コンパイラがこの変数の値を仮定しないように、この変数が予想外に変更される可能性があるということです.正確には、オプティマイザは、レジスタに保存されたバックアップではなく、この変数を使用するたびに、この変数の値を慎重に再読み取りする必要があります.volatile変数のいくつかの例を次に示します.
1)、パラレルデバイスのハードウェアレジスタ(例えば、ステータスレジスタ);
2)、割り込みサービスサブルーチンでアクセスされる非自動変数(Non-automatic variables);
3)、マルチスレッドアプリケーションでいくつかのタスクによって共有される変数.
(3)、const
constは「読み取り専用」(標準ではないが正しい答え)を意味する.
次の声明はどういう意味ですか.
const int a;
int const a;
const int *a;
int * const a;
int const * a const;

最初の2つの役割は同じで、aは常整型数です.
3つ目は、aが定数数を指すポインタであることを意味する(すなわち、整数数は変更できないが、ポインタは可能である).
4番目の意味aは、整数数を指す常ポインタ(すなわち、ポインタが指す整数数は修正可能であるが、ポインタは修正不可能である)である.
最後に、aは、定数数を指す定数ポインタであることを意味する(すなわち、ポインタが指す整数数は修正不可能であり、ポインタも修正不可能である).