面接知識総括(一)


1、配列a[N]は、1〜N−1個の数が格納され、そのうちの数が1回繰り返される.関数を書き、繰り返される数値時間の複雑さを見つけるには、o(N)関数のプロトタイプでなければなりません.
 
int find(int a[],int n){
    int temp[n]={0};
    int i;
    for(i=0;i<n;i++){
        if(temp[a[i]] != 0){
            return a[i];
        }else{
            temp[a[i]]=1;
        }
    }
}

 
2、一つの文はxが2であるかどうかの数回のべき乗の判断を実現する
int i = 512;
cout << ((i & (i - 1)) ? false : true) << endl;

ビットと演算子a&bによって、bの中で1のビットに対してaの中でも1であれば保持し、aの中の残りのビットはすべて0にし、残りのaは結果としてaの中でbの中のビット1に対応するビットを保持し、残りの0にすることも理解できる.残りのビット単位演算子は、aとbをビット単位で演算し、得られた値が結果となる.
 
3、
 
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;

 
結果:0 0 1解答:str 1,str 2,str 3,str 4は配列変数であり、それぞれのメモリ空間がある.一方、str 5、str 6、str 7、str 8はポインタであり、同じ定数領域を指す.C言語はそうではないことに注意してください.定数の住所も違います.
 
4、ポインタの引用……
 
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}

出力:2,5
&aは配列ポインタであり、そのタイプはint(*)[5];一方,ポインタプラス1は,ポインタタイプに応じて一定の値を加算し,異なるタイプのポインタ+1以降に増加するサイズが異なる.aは長さ5のint配列ポインタなので、5*sizeof(int)を加算します.だからptrは実際にはa[5].しかしprtは(&a+1)タイプとは異なるため(この点が重要)、prt-1はsizeof(int*)を減算するだけである.a,&aのアドレスは同じであるが意味が異なる、aは配列ヘッダアドレス、すなわちa[0]のアドレス、&aはオブジェクト(配列)ヘッダアドレス、a+1は配列の次の要素のアドレス、すなわちa[1],&a+1は次のオブジェクトのアドレス、すなわちa[5]である.
 
5、デッドロックの4つの必要条件反発、要求保持、剥奪不可、ループ
 
6、デッドロックの処理ダチョウ戦略、予防戦略、回避戦略、検出とデッドロック解除
 
7、オペレーティングシステムのプロセススケジューリングポリシーは何種類ありますか?FCFS(先着順サービス)、優先度、タイムスライス回転、マルチレベルフィードバック
 
8、tcp/udpはどの層に属しますか?tcp/udpのメリットとデメリットは何ですか?
 
 
 
tcp/udpは、輸送層TCPサービスに属し、データストリーム伝送、信頼性、有効ストリーム制御、フルデュプレクス動作、多重化技術などを提供する.UDPは、TCPとは異なり、IPプロトコルに対する信頼性の高いメカニズム、フロー制御、エラー復旧機能などを提供しない.UDPは比較的簡単であるため、UDPヘッダはわずかなバイトを含み、TCP負荷よりも消費が少ない.tcp:安定した伝送サービスを提供し、流量制御があり、欠点はパケットが大きく、冗長性が悪いudp:安定したサービスを提供しない、パケットが小さく、オーバーヘッドが小さい
 
9、(void*)ptrと(*(void*)ptrの結果は同じですか?ptrは同じポインタです.
 
同じです.1つ目はptrを強制的に空のタイプを指すポインタに変換することです.2番目(*(void*)ptrは、まず中を見て、voidポインタを指すポインタ、すなわち2次ポインタに変換されます.さらに前に*をつけると内容を取るので内容もポインタです.このポインタは空のタイプを指しているので、強制変換後は最初と同じです.
 
10、絶対アドレス0 x 100000に値を付けるにはどうすればいいですか?プログラムを絶対アドレス0 x 10000000にジャンプさせたい場合は、どうすればいいですか?
 
         (unsigned int*)0x100000 = 1234
 
まず、0 x 10000000を関数ポインタ(void(*)()0 x 10000000に強制的に変換します.次に、*((void(*)()0 x 10000000)()を呼び出します.typedefでもっと直感的に見ることができます:typedef void(*)()voidFuncPtr;  *((voidFuncPtr)0x100000)();     
 
 
 
       
このブログは阿修罗道から出ています.転載は出典を明記してください.http://blog.csdn.net/fansongy/article/details/6890353