C / C ++インタビューでよく遭遇する古典的なインタビューの質問

ここに写真の説明を挿入
C ++のインタビューに行きたい場合は、チェックしてください。インターネットを検索して見ただけなので、整理します。

1.変数の宣言と定義の違いは何ですか?

定数:プログラムの実行中に変更されない量、および変更できない量
変数:プログラムの実行中に変更できる量
変数の定義方法:データ型変数名=定数;
int num = 10; //定義(ストレージスペースの割り当て、初期値は一定)
int num; //宣言の定義(ストレージスペースの割り当て、ガベージ値の割り当て)
extern int num; //参照宣言参照宣言、(ストレージスペースの割り当てなし、ガベージ値を割り当てないでください)は、このドキュメントの使用に限定されません。
•変数の定義は、変数にストレージスペースを割り当てるために使用されます。また、変数の初期値を指定することもできます。プログラムでは、変数の定義は1つだけ
です。通常、このように記述します。スペースを設定する宣言を「定義」、ストレージスペースを設定する必要のない宣言を「宣言」と呼びます。明らかに、ここで参照している宣言は、より狭い宣言、つまり狭い意味での宣言、つまり非定義ステートメント
です。関数が宣言されると、コンパイラは
関数にエントリアドレスを割り当てません。関数が定義されると、関数コードセグメントはこの時点で関数にストレージスペースが割り当てられている場合でも、関数名は関数のエントリアドレスをマップします。
•宣言の最終的な目的は、事前に使用すること、つまり定義の前に使用することです。事前に使用する必要がない場合は、個別に宣言する必要はありません。これは変数と関数の場合です。したがって、宣言はストレージスペースを割り当てず、定義されたときにのみ割り当てます。ストレージ

2. bool intfloatポインター変数をゼロ値と比較するifステートメントを記述します

ブール型データ
If(flag)
If(!flag)

Intデータ:
if(0!= flag)
If(0 == flag)

ポインタデータ:
if(NULL == flag)
If(NUJLL!= flag)

Float型データデータ:NORM0.00001を
定義します。
if(flag> = -NORM && flag <= NORM)

注:int、pointer変数、およびゼロ値を比較する場合は特に注意して、ゼロ値を左側に配置してください。これにより、==が誤って=と記述された場合、コンパイラーはエラーを報告できます。そうしないと、論理エラーを見つけるのが容易でなく、非常に深刻な結果につながります。

3.sizeofとstrlenの違い

sizeofとstrlenの違いは次のとおりです
。sizeofは演算子、strlenはライブラリ関数
sizeofのパラメータであり、データのタイプまたは変数にすることができます。strlenは、パラメータとして「\ 0」で終わる文字列のみにすることができます。
コンパイラはsizeofの結果をコンパイルして計算し、strlen関数を実行して計算する必要があります。また、sizeofはデータ型が占めるメモリのサイズを計算し、strlenは文字列の実際の長さを計算します。
配列はsizeofのパラメータとして縮退せず、strlenを渡すと縮退してポインタになります。
注:一部の演算子は関数のように見え、一部の関数名は演算子のように見えます。このような紛らわしい名前は区別する必要があります。そうしないと、パラメーターとして配列名などの特別なデータタイプに遭遇したときに間違いを犯しやすくなります。 。関数として最も混乱しやすい演算子はsizeofです。

4.4。C言語のキーワードstaticとC ++のキーワードstaticの違いは何ですか

Cでは、staticは、ローカル静的変数と外部静的変数および関数を変更するために使用されます。上記の関数に加えて、C ++は、クラスのメンバー変数と関数、つまり静的メンバー変数と静的メンバー関数を定義するためにも使用されます。
注:静的メモリとプログラミングのグローバル特性により、異なる期間に呼び出される関数を作成できます。通信、情報転送、およびC ++静的メンバーは、複数のオブジェクトインスタンス間で通信して情報を転送できます。

5.cのmallocとc ++のnewの違いは何ですか

Mallocとnewには、次の違いがあります。newと
deleteは演算子であり、オーバーロードできます
。MallocはC ++でのみ使用できます。Free上書き可能な関数です。newCとC ++の両方で使用して
、オブジェクトのコンストラクター呼び出すことできます。対応するdeleteは、対応するデストラクタを呼び出します
。Mallocはメモリを割り当てるだけで、freeはメモリを再利用するだけで、コンストラクタとデストラクタを実行しません。
新しいdeleteは特定のデータタイプのポインタを返し、malloc freeはvoidポインタを返します。
注:mallocによって要求されたメモリスペースは空きで解放する必要があり、newによって要求されたメモリスペースは削除で解放する必要があります.2つの実装メカニズムが異なるため、混同しないでください

6.標準マクロMINを記述します

#define min(a、b)((a)<=(b)?(a):( b))
注:呼び出すときは、このマクロ定義の副作用に注意してください。次のように呼び出します
(++ * p)<( x)?(++ * p):( x)
Pポインターが2回追加されました。これは、MINの本来の意図に違反しています。

7.ポインタを揮発性にすることはできますか

Volatileは、次の場所で使用され
ます。1。他のプログラムによる検出のために割り込みサービスプログラムで変更された変数は、volatileを追加する必要があります
。2。マルチタスク環境のタスク間で共有されるフラグは、volatileを追加する必要があります
。3。メモリマップハードウェアレジスタ通常、揮発性の説明も追加します。これは、読み取りと書き込みのそれぞれが異なる意味を持つ可能性があるためです。
ここに写真の説明を挿入

8.8。aと&aの違いは何ですか

次のコードの印刷結果を記述してください。主な目的は、aと&aの違いを調べることです。
#include <stdlo.h>
Void main()
{ Int a [5] = {1,2,3,4,5}; Int * ptr =(int )(&a + 1); Printf(“%d、%d”、(a + 1)、(ptr-1)); Return; }




出力結果:2,5
注:配列名aは配列の最初のアドレスとして使用でき、&aは配列へのポインターです。
考えてみてください。元のint * ptr =(int *)(&a + 1);
がint * ptr =(int *)(a + 1)である場合の出力どうなりますか

9CおよびC ++プログラムコンパイルのメモリ割り当てについて簡単に説明します

(1)静的ストレージ領域からの割り当て:
メモリはプログラムのコンパイル時に割り当てられます。このメモリはプログラムの実行期間全体にわたって存在します。システムがグローバル変数、静的変数などをクリーンアップするため、高速でエラーが発生しません。等
(2)スタック上に割り当てられた:
機能を実行するとき、ローカル変数記憶部の機能は、スタック上に作成され、これらのメモリセルの機能が自動的に構築された命令プロセッサに集中する実行スタックメモリ割り当て動作の終了時に解放されます、高効率ですが、割り当てられるメモリ容量には制限があります。
(3)ヒープからの割り当て:
動的メモリ割り当て。プログラムは、mallocまたはnewを使用して、プログラムの実行時に任意のサイズのメモリを適用します。プログラマは、メモリを解放または削除するタイミングを決定します。動的メモリの寿命はプログラマーによって決定され、非常に柔軟に使用できます。ヒープにスペースが割り当てられている場合は、それを再利用する責任があります。そうしないと、実行中のプログラムでメモリリークが発生します。さらに、さまざまなサイズのヒープスペースを頻繁に割り当てたり解放したりすると、ヒープ内に破片を生成します。
C、C ++プログラムがコンパイルされると、メモリは5つのストレージ領域に分割されます。ヒープ領域、スタック領域、グローバル領域、テキスト定数領域、およびプログラムコード領域です。

10 strcpy、sprintf、memecpyの違いを簡単に説明してください

3つの主な違いは次のとおりです。
(1)操作オブジェクトが異なります。strcpyの2つの操作オブジェクトは文字列、sprintfの操作オブジェクトは複数のデータタイプ、ターゲット操作オブジェクトは文字列、memcpyの2つのオブジェクトは次のとおりです。 2つの任意の操作可能なメモリアドレスは、どのデータタイプにも制限されません。
(2)実行機能が異なります:strcpyは主に文字列変数間のコピーを実現し、sprintfは主に他のデータタイプ形式から文字列タイプへの変換を実現し、memcpyは主にメモリブロック間のコピーです
(3)実行効率は異なります:memcpyが最高、sprintf最小限の
説明:strcpy、sprintf、memcpyはすべてコピー機能を実現できますが、ターゲットは異なります。実際のニーズに応じて、適切な機能を選択してコピー機能を実現します。

11.11。アドレスがox67a9の整数変数の値をoxaa66に設定します

int * ptr;
Ptr =(int *)ox67a9;
* Ptr = oxaa66;
注:この質問は、アドレスの長さと整数データの長さが同じプラットフォーム、つまり整数に関係なく、強制型変換の典型的な例です。意味がある限り、データをアドレスポインタタイプに強制することができます。

12.オブジェクト指向の3つの特徴

オブジェクト指向の3つの特性は、カプセル化、継承、および多態性です。

13. C ++空クラスのメンバー関数は何ですか

(1)デフォルトのコンストラクター
(2)デフォルトのコピーコンストラクター
(3)デフォルトのデストラクタ
(4)デフォルトの割り当て演算子
(5)デフォルトのアドレス演算子
(6)デフォルトのアクセスアドレス演算子const
注:一部の本では、後の2つの関数については触れずに、最初の4つの関数を紹介していますが、後の2つの関数は空のクラスのデフォルト関数でもあります。さらに、西洋医学はこれらの関数が実際に使用される場合にのみ、コンパイラーがそれらを定義することに注意を払っています。

14.コピーコンストラクターと割り当て演算子についての知識について話します

コピーコンストラクタとコピー演算子のオーバーロードには、次の2つの違いがあります。
(1)コピーコンストラクタは新しいクラスオブジェクトを生成し、割り当て操作はできません
(2)コピーコンストラクタは新しいクラスオブジェクトを直接構築するため、初期化されますこのオブジェクトは、ソースオブジェクトが新しく作成されたオブジェクトと同じであるかどうかを確認する必要がなく、割り当て演算子でこの操作が必要です。さらに、元のオブジェクトのメモリが割り当て演算子で割り当てられていない場合は、最初にメモリを解放する必要があります。
注:クラスにポインタタイプがある場合メンバー変数を作成するときは、デフォルトのものを使用する代わりに、コピーコンストラクターと割り当て演算子を書き直す必要があります。

15.クラスメンバー関数の書き換え、オーバーロード、および非表示の違いを簡単に説明します

(1)オーバーライドとオーバーロードは、主に次の点で異なり
ます。スコープの違い:オーバーライドされた関数とオーバーライドされた関数は2つのクラスにあり、同じクラスのオーバーロードされた関数とオーバーロードされた関数の
パラメーターの違い:書き換えられた関数と書き換えられた関数のパラメータリストは同じである必要があり、オーバーロードされた関数とオーバーロードされた関数のパラメータリストは異なっている必要があります
仮想の違い:書き換えられた基本クラス書き換えられた関数は仮想である必要があります装飾、およびオーバーロードされた関数とオーバーロードされた関数は、仮想装飾されている場合とされていない場合があります。
(2)非表示とオーバーライド。オーバーロードには次の違いがあります。オーバーロード
の範囲が異なります。オーバーライドと同様に、非表示関数と非表示関数は同じクラスにありません。
パラメーターの違い:非表示関数と非表示関数パラメータリストは同じでも異なっていてもかまいませんが、関数名は同じである必要があります。パラメータが同じでない場合、基本クラスのパラメータが仮想によって変更されているかどうかに関係なく、基本クラスの機能は上書きされるのではなく非表示になります。
注:オーバーロードとオーバーライドの両方が多態性を実現するための基礎ですが、それらが実装するテクノロジーは完全に異なり、目標も完全に異なります。オーバーライドは動的にバインドされた多態性ですが、オーバーロードはより静的にバインドされます。状態

16.多型の原理を簡単に説明します

コンパイラは、クラス内で仮想関数を見つけると、このクラスの仮想関数テーブルvtableをすぐに生成します。仮想関数テーブルのエントリは、対応する仮想関数へのポインタです。コンパイラは、このクラスに暗黙的にポインタを挿入します。 vptr(vcコンパイラの場合、クラスの最初の位置に挿入されます)は、仮想関数テーブルを指します。このクラスのコンストラクタが呼び出されると、コンパイラはvptrとvtableの関連コードを暗黙的に実行し、vptrを指します。対応するvtableは、クラスをこのクラスのvtableに接続します。さらに、クラスのコンストラクターが呼び出されると、基本クラスへのポインターが特定のクラスへのthisポインターになっているため、これに依存してこのポインターを正しく取得できます。 vtableは、この方法で実際に関数本体に接続できます。これが、動的バインディングと多態性の基本原則です。
注:仮想関数、純粋な仮想関数、および仮想継承を区別する必要があります。多形性C ++インタビューの重要なテストポイントの1つであり、仮想機能は多形性の基礎であるため、仮想機能実現の原則を覚えておいてください。

17.リンクリストと配列の違いは何ですか

アレイとリンクリストは、次の点で異なります。
(1)ストレージ形式:アレイは連続スペースであり、宣言時に長さを決定する必要があります。リンクリストは可変長の不連続動的スペースであり、各ノードは隣接して保存する必要があります。ノードへのポインタ。
(2)データ検索:配列の線形検索は高速です。検索操作はオフセットアドレスを直接使用します。リンクリストはノードを順番に取得する必要があるため、非効率的です。
(3)データの挿入と削除:リンクリストはノードをすばやく挿入および削除できますが、配列は大量のデータ移動が必要になる場合があります。
(4)範囲外の問題:リンクリストに範囲外の問題がありません。配列に範囲外の問題があります。
説明:配列またはリンクリストのデータ構造を選択するときは、実際のニーズに応じて選択する必要があります。配列はクエリが簡単で、リンクリストは挿入と削除が簡単です。配列はスペースを節約しますが長さは節約できますリンクリストは長くなりますが、より多くのストレージスペースを使用するように修正されました

18.単一リンクリストを元に戻す方法

1.単一リンクリストの逆循環アルゴリズム

  1. リンクリストには次の2つのタイプがあります。
    •リーディングノード:ヘッドノードは長さ情報を格納し、次のヘッドノードは最初の実際のノードを指します。
    •ヘッドノードがない場合、ヘッドノードは最初のノードです。
    ヘッドノードはここ使用されます。ノードのリンクリスト。
  2. 現在のノード(反転用)、前のノード、および次のノード(反転後の転送用)を記録するには、3つのポインターが必要です。
    コードは以下の通りである:
    / *
    リンクされたリスト
    1.リーディングノード:リンクされたリスト(または他の情報)の長さは、ヘッドに格納され、頭部>まず実際のノードへの次のポイント、
    主要ノードなし2:ヘッドが最初の実際のノードであります
    * /
    typedef struct Node
    { int data; Node * next; }; void reverseList(Node * head){ if((head == NULL)||((head-> next)== NULL))return; // ifヘッドが空の場合、またはヘッドノードが空のノードを指している場合(リンクリストの長さは0)、終了します。Node * pre、* cur、* next; // curは現在の位置を記録し、preは前の位置を記録します。これはcur-> nextの値です。nextは次の位置を記録し、curはcur-> next cur = headと等しくありません。-> next; pre = NULL; //反転後、ヘッドノードがテールノードになり、その次はNullですwhile(cur!= NULL){ next = cur-> next; //反転後はcur-を使用できなくなります> nextなので、最初にこのノードを記録しますcur-> next = pre; pre = cur; cur = next;















    }
    head-> next = pre; // curはすでに空なので、preがテールノードです。head-> nextはそれを指します。
    戻る;
    }

2.単一リンクリストを反転するための再帰的アルゴリズム
コードは次のとおりです
。List* reverse(List * oldList、List * newHead = NULL)
{ List * next = oldList-> next; //最後のフリップの後にリンクリストを記録しますoldList-> next = newHead; // newHead = oldListを反転した後、リンクリストの先頭に現在のノードを挿入します; //残りのリンクリストを再帰的に処理しますreturn(next == NULL)?newHead:reverse(t、newHead); }




19.キューとスタックの類似点と相違点を簡単に説明します

キューとスタックはどちらも線形ストレージ構造ですが、データの挿入と削除の操作が異なります。キューはファーストインファーストアウトで、スタックはラストインファーストアウトです。
注:スタック領域とヒープ領域は互いに区別されます。スタック領域はラストイン、ファーストアウトです。スタックはコンパイラによって自動的に割り当てられ、関数パラメータ値とローカル変数値を格納します。その操作はデータ構造のスタックと同様です。ヒープは通常、プログラマによって割り当てられ、解放されます。プログラマが解放しない場合、プログラムが終了すると、osによって再利用される場合があります。割り当て方法はリンクリストに似ています。この質問のヒープとスタックとは異なります。スタックは単なるデータ構造であり、ヒープ領域とスタック領域はプログラム内の異なるメモリストレージ領域です。

最後に、面接対象者の成功を祈っています。
ここに写真の説明を挿入

上記の欠陥があるかもしれません、議論を指摘することを歓迎します、あなたの転送サポートを得ることを望んでいる友人、そして私をフォローし続けることができます。
(フォロー+プライベートメッセージ:C ++、学習資料とビデオを入手)
ここに写真の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_52622200/article/details/110281341