linux C經典面試題九

2021-06-13 13:23:12 字數 2519 閱讀 5393

思科

1. 用巨集定義寫出swap(x,y)

#define swap(x, y)\

x = x + y;\

y = x - y;\

x = x - y;

2.陣列a[n],存放了1至n-1個數,其中某個數重複一次。寫乙個函式,找出被重複的數字.時間複雜度必須為o(n)函式原型:

int do_dup(int a,int n)

3 一語句實現x是否為2的若干次冪的判斷

int i = 512;

cout << boolalpha << ((i & (i - 1)) ? false : true) << endl;

4.unsigned int intvert(unsigned int x,int p,int n)實現對x的進行轉換,p為起始轉化位,n為需要轉換的長度,假設起始點在右邊.如x=0b0001 0001,p=4,n=3轉換後x=0b0110 0001

unsigned int intvert(unsigned int x,int p,int n)

_t = _t << p;

x ^= _t;

return x;

}慧通:

什麼是預編譯

何時需要預編譯:

1、總是使用不經常改動的大型**體。

2、程式由多個模組組成,所有模組都使用一組標準的包含檔案和相同的編譯選項。在這種情況下,可以將所有包含檔案預編譯為乙個預編譯頭。

char * const p;

char const * p

const char *p

上述三個有什麼區別?

char * const p; //常量指標,p的值不可以修改

char const * p;//指向常量的指標,指向的常量值不可以改

const char *p; //和char const *p

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 1

解答:str1,str2,str3,str4是陣列變數,它們有各自的記憶體空間;

而str5,str6,str7,str8是指標,它們指向相同的常量區域。

12. 以下**中的兩個sizeof用法有問題嗎?[c易]

void uppercase( char str ) // 將 str 中的小寫字母轉換成大寫字母

char str = "abcde";

cout << "str字元長度為: " << sizeof(str)/sizeof(str[0]) << endl;

uppercase( str );

cout << str << endl;

答:函式內的sizeof有問題。根據語法,sizeof如用於陣列,只能測出靜態陣列的大小,無法檢測動態分配的或外部陣列大小。函式外的str是乙個靜態定義的陣列,因此其大小為6,函式內的str實際只是乙個指向字串的指標,沒有任何額外的與陣列相關的資訊,因此sizeof作用於上只將其當指標看,乙個指標為4個位元組,因此返回4。

乙個32位的機器,該機器的指標是多少位

指標是多少位只要看位址匯流排的位數就行了。80386以後的機子都是32的資料匯流排。所以指標的位數就是4個位元組了。

main()

;int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}輸出:2,5

*(a+1)就是a[1],*(ptr-1)就是a[4],執行結果是2,5

&a+1不是首位址+1,系統會認為加乙個a陣列的偏移,是偏移了乙個陣列的大小(本例是5個int)

int *ptr=(int *)(&a+1);

則ptr實際是&(a[5]),也就是a+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].

linux C經典面試題 四

例子 code examples 12 下面的 輸出是什麼,為什麼?void foo void 這個問題測試你是否懂得c語言中的整數自動轉換原則,我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答案是輸出是 6 原因是當表示式中存在有符號型別和無符號型別時所有的運算元都自動轉換為無符號...

linux C經典面試題六

11.windows是核心級執行緒麼。12.linux有核心級執行緒麼。答 執行緒通常被定義為乙個程序中 的不同執行路線。從實現方式上劃分,執行緒有兩 種型別 使用者級執行緒 和 核心級執行緒 使用者執行緒指不需要核心支援而在使用者程式 中實現的執行緒,其不依賴於作業系統核心,應用程序利用執行緒庫提...

linux C經典面試題十

1.請問以下 有什麼問題 int main 沒有為str分配記憶體空間,將會發生異常 問題出在將乙個字串複製進乙個字元變數指標所指位址。雖然可以正確輸出結果,但因為越界進行內在讀寫而導致程式崩潰。char s aaa printf s s s 0 b printf s s 有什麼錯?aaa 是字串常...