1.編寫(xiě)my_strcpy函數,實(shí)現與庫函數strcpy類(lèi)似的功能,不能使用任何庫函數;
答:char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
returnstrDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘’);
returntempptr ;
}
2. 頭文件中的ifndef/define/endif的作用?
答:防止該頭文件被重復引用。
3. #i nclude 4. 在C++ 程序中調用被C 編譯器編譯后的函數,為什么要加extern“C”? 5. 面向對象的三個(gè)基本特征,并簡(jiǎn)單敘述之? 6. 重載(overload)和重寫(xiě)(overried,有的書(shū)也叫做“覆蓋”)的區別? 7. 多態(tài)的作用? 8. 分別寫(xiě)出BOOL,int,float,指針類(lèi)型的變量a 與“零”的比較語(yǔ)句。 9. 請說(shuō)出const與#define 相比,有何優(yōu)點(diǎn)? 10.簡(jiǎn)述數組與指針的區別? 11.變量的聲明和定義有什么區別? 12. 解釋堆和棧的區別。 13. const的作用是什么? 14. 下列哪兩個(gè)是等同的 15. 完成程序,實(shí)現對數組的降序排序 16. int i=(j=4,k=8,l=16,m=32); printf(“%d”, i); 輸出是多少? 17. 請簡(jiǎn)述以下兩個(gè)for循環(huán)的優(yōu)缺點(diǎn)(5分) 19. .C++里面如何聲明const void f(void)函數為C程序中的庫函數? 20. 請寫(xiě)出下面代碼在 32 位平臺上的運行結果,并說(shuō)明sizeof的性質(zhì): 21. C++中,關(guān)鍵字struct和class的區別僅僅在于: 22. 頭文件的作用是什么? 23. C++函數中值的傳遞方式有哪幾種? 24. 內存的分配方式的分配方式有幾種? 25. 設計函數intatoi(char *s)。 26. 編寫(xiě)strcat函數(6分) 27. MFC中CString是類(lèi)型安全類(lèi)么? 28.函數模板與類(lèi)模板有什么區別? 29. 寫(xiě)一個(gè)“標準”宏MIN,這個(gè)宏輸入兩個(gè)參數并返回較小的一個(gè)。 ((*p++) <= (b) ? (*p++) : (*p++)) 30. 嵌入式系統中經(jīng)常要用到無(wú)限循環(huán),你怎么樣用C編寫(xiě)死循環(huán)呢? 31. 用變量a給出下面的定義 32. 1)關(guān)鍵字static的作用是什么?答:(1)用于全局變量;(2)用于局部變量;(3)用于函數。 33. 如何判斷一段程序是由C 編譯程序還是由C++編譯程序編譯的? 34. 數組a[N],存放了1至N-1個(gè)數,其中某個(gè)數重復一次。寫(xiě)一個(gè)函數,找出被重復的數字.時(shí)間復雜度必須為o(N)函數原型:intdo_dup(int a[],int N) 35. 程序由多個(gè)模塊組成,所有模塊都使用一組標準的包含文件和相同的編譯選項。在這種情況下,可以將所有包含文件預編譯為一個(gè)預編譯頭。 36. 有1,2,….一直到n的無(wú)序數組,求排序算法,并且要求時(shí)間復雜度為O(n),空間復雜度O(1),使用交換,而且一次只能交換兩個(gè)數。 37. 寫(xiě)一個(gè)函數比較兩個(gè)字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1 38. 用預處理指令#define 聲明一個(gè)常數,用以表明1年中有多少秒(忽略閏年問(wèn)題) 39.Typedef在C語(yǔ)言中頻繁用以聲明一個(gè)已經(jīng)存在的數據類(lèi)型的同義字。也可以用預處理器做類(lèi)似的事。例如,思考一下下面的例子: 40. C語(yǔ)言同意一些令人震驚的結構,下面的結構是合法的嗎,如果是它做些什么? 41. char* ss = “0123456789″; 42.冒泡法://從小到大排序,比較n次,每次拿一個(gè)從頭比到尾
答:前者編譯器從標準庫路徑開(kāi)始搜索file.h,而后者編譯器從用戶(hù)的工作路徑開(kāi)始搜索file.h。
答:extern是C/C++語(yǔ)言中表明函數和全局變量作用范圍(可見(jiàn)性)的關(guān)鍵字,其聲明的函數和變量可以在本模塊或其它模塊中使用。
通常,在模塊的頭文件中對本模塊提供給其它模塊引用的函數和全局變量以關(guān)鍵字extern聲明。
答:1)封裝:將客觀(guān)事物抽象成類(lèi),每個(gè)類(lèi)對自身的數據和方法實(shí)行protection(private, protected,public)
2)繼承:實(shí)現繼承(指使用基類(lèi)的屬性和方法而無(wú)需額外編碼的能力)、可視繼承(子窗體使用父窗體的外觀(guān)和實(shí)現代碼)、接口繼承(僅使用屬性和方法,實(shí)現滯后到子類(lèi)實(shí)現)。
3)多態(tài):允許將子類(lèi)類(lèi)型的指針賦值給父類(lèi)類(lèi)型的指針。
答:從定義上來(lái)說(shuō):
重載:是指允許存在多個(gè)同名函數,而這些函數的參數表不同(或許參數個(gè)數不同,或許參數類(lèi)型不同,或許兩者都不同)。
重寫(xiě):是指子類(lèi)重新定義復類(lèi)虛函數的方法。
從實(shí)現原理上來(lái)說(shuō):
重載:編譯器根據函數不同的參數表,對同名函數的名稱(chēng)做修飾,然后這些同名函數就成了不同的函數。
重寫(xiě):當子類(lèi)重新定義了父類(lèi)的虛函數后,父類(lèi)指針根據賦給它的不同的子類(lèi)指針,動(dòng)態(tài)的調用屬于子類(lèi)的該函數,這樣的函數調用在編譯期間是無(wú)法確定的(調用的子類(lèi)的虛函數的地址無(wú)法給出)。
答:主要是兩個(gè):1)隱藏實(shí)現細節,使得代碼能夠模塊化;擴展代碼模塊,實(shí)現代碼重用;2)接口重用,為了類(lèi)在繼承和派生的時(shí)候,保證使用家族中任一類(lèi)的實(shí)例的某一屬性時(shí)的正確調用。
答:BOOL :if ( !a ) or if(a)
int :if ( a ==0)
float :const EXPRESSION EXP = 0.000001
if ( a < EXP && a >-EXP)
pointer : if ( a != NULL) or if(a == NULL)
答案:1) const 常量有數據類(lèi)型,而宏常量沒(méi)有數據類(lèi)型。編譯器可以對前者進(jìn)行類(lèi)型安全檢查。而對后者只進(jìn)行字符替換,沒(méi)有類(lèi)型安全檢查,并且在字符替換可能會(huì )產(chǎn)生意料不到的錯誤。
2) 有些集成化的調試工具可以對const 常量進(jìn)行調試,但是不能對宏常量進(jìn)行調試。
數組要么在靜態(tài)存儲區被創(chuàng )建(如全局數組),要么在棧上被創(chuàng )建。指針可以隨時(shí)指向任意類(lèi)型的內存塊。
(1)修改內容上的差別
char a[] = “hello”;
a[0] = ‘X’;
char *p = “world”; // 注意p 指向常量字符串
p[0] = ‘X’; // 編譯器不能發(fā)現該錯誤,運行時(shí)錯誤
(2) 用運算符sizeof 可以計算出數組的容量(字節數)。sizeof(p),p 為指針得到的是一個(gè)指針變量的字節數,而不是p 所指的內存容量。C++/C 語(yǔ)言沒(méi)有辦法知道指針所指的內存容量,除非在申請內存時(shí)記住它。注意當數組作為函數的參數進(jìn)行傳遞時(shí),該數組自動(dòng)退化為同類(lèi)型的指針。
char a[] = “hello world”;
char *p = a;
cout<
cout<
計算數組和指針的內存容量
voidFunc(char a[100])
{
cout<
}
答:聲明變量不分配空間,定義變量要分配空間。聲明主要是告訴編譯器,后面的引用都按聲明的格式。定義其實(shí)包含了聲明的意思,同時(shí)要分配內存空間。
答:堆(heap)——一般由程序員分配釋放,若程序員不釋放,程序結束時(shí)可能由OS回收。注意它與數據結構中的堆是兩回事,分配方式倒是類(lèi)似于鏈表。速度比較慢,而且容易產(chǎn)生內存碎片,不過(guò)用起來(lái)最方便。
棧(stack)——由編譯器自動(dòng)分配釋放,存放函數的參數值,局部變量的值等。其操作方式類(lèi)似于數據結構中的棧。由系統自動(dòng)分配,速度較快。但程序員是無(wú)法控制的。
答:(1)可以定義const常量
(2)const可以修飾函數的參數、返回值,甚至函數的定義體。被const修飾的東西都受到強制保護,可以預防意外的變動(dòng),能提高程序的健壯性。
int b;
A constint* a = &b; //指向常量的指針,不能通過(guò)指針改變b,但指針的地址可以改變。
B const* int a = &b;// 指針的地址不可以改變,但可以通過(guò)指針改變b的值
C constint* const a = &b; //指針指向的值,和指針本身的地址都不能改變
D intconst* const a = &b;//與c相同
#include
void sort(int array[] );
int main()
{
int array[]={45,56,76,234,1,34,23,2,3}; //數字任//意給出
sort( array );
return 0;
}
void sort( int array[] )
{____________________________________
inti,j,k;
for(i=1;i<=7;i++) { if(array[i]>array[i-1])
{
k=ARRAY[i];
j=i-1;
do
{
array[j+1]=array[j];
j– ;
}
while(k>array[j]&&j>=0);
array[j+1]=k;
}
}
—————————————————–
}
答:相當于 i=j=4;i=k=8;i=l=16;i=m=32; 故最后i=32;
1)for (i=0; i
{
if (condition)
DoSomething();
else
DoOtherthing();
}
2)if (condition)
{
for (i=0; i
DoSomething();
}
else
{
for (i=0; i
{
*psTo++ = *psFrom++;
}
returnpvTo;
}
答:在該函數前添加extern “C”聲明。由于編譯后的名字不同,C++程序不能直接調用C 函數。
#include
#include
int main(void)
{
char a[30];
char *b = (char *)malloc(20 * sizeof(char));
printf(“%d\n”, sizeof(a));
printf(“%d\n”, sizeof(b));
printf(“%d\n”, sizeof(a[3]));
printf(“%d\n”, sizeof(b+3));
printf(“%d\n”, sizeof(*(b+4)));
return 0 ;
}
答:在32位系統下(如WIN32),指針長(cháng)度為32位。a是一個(gè)有30個(gè)元素的字符型數組;b是一個(gè)字符串指針;a[3]是字符型;b+3是指針;*(b+4)是字符型。
因此輸出: 30、4、1、4、1
struct定義的類(lèi)的缺省成員為公有的,而class定義的類(lèi)的缺省成員為私有的;
答:1)通過(guò)頭文件來(lái)調用庫功能。2)頭文件能加強類(lèi)型安全檢查。
答:C++函數的三種傳遞方式為:值傳遞、指針傳遞和引用傳遞。
答:1)從靜態(tài)存儲區域分配。內存在程序編譯的時(shí)候就已經(jīng)分配好,這塊內存在程序的整個(gè)運行期間都存在。例如全局變量。
2)在棧上創(chuàng )建。在執行函數時(shí),函數內局部變量的存儲單元都可以在棧上創(chuàng )建,函數執行結束時(shí)這些存儲單元自動(dòng)被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
3)從堆上分配,亦稱(chēng)動(dòng)態(tài)內存分配。程序在運行的時(shí)候用malloc或new申請任意多少的內存,程序員自己負責在何時(shí)用free或delete釋放內存。動(dòng)態(tài)內存的生存期由我們決定,使用非常靈活,但問(wèn)題也最多。
答:intatoi (char *s)
{
int i = 0,sum = 0,sign; //輸入的數前面可能還有空格或制表符應加判斷
while(*s==”||*s==’\t’)
{
i++;
}
sign = (*s==’-')?-1:1;
if(*s==’-'|| *s==’+')
{
i++;
}
while(*s!=’\0′)
{
sum = *s-’0′+sum*10;
i++;
}
return sign*sum;
}
已知strcat函數的原型是char *strcat (char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不調用C++/C 的字符串庫函數,請編寫(xiě)函數strcat
答:
char * __cdeclstrcat(char * dst, const char * src)
{
char * cp = dst;
while( *cp )
cp++; /* find end of dst */
while( *cp++ = *src++ ) ; /* Copy src to end of dst */
return(dst ); /* return dst */
}
(2)strcat能把strSrc的內容連接到strDest,為什么還要char * 類(lèi)型的返回值?
答:方便賦值給其他變量。
答:不是,其它數據類(lèi)型轉換到CString可以使用CString的成員函數Format來(lái)轉換
答:函數模板的實(shí)例化是由編譯程序在處理函數調用時(shí)自動(dòng)完成的,而類(lèi)模板的實(shí)例化必須由程序員在程序中顯式地指定。
答:#define MIN(A,B) ((A) <= (B) ? (A) : (B)) 宏的副作用(與某些函數的混淆):least = MIN(*p++, b)。宏定義#define MIN(A,B) ((A) <= (B) ? (A) : (B))對MIN(*p++, b)的作用結果是:
答:while(1){}或者for(;;)
a) 一個(gè)整型數(An integer)
b) 一個(gè)指向整型數的指針(A pointer to an integer)
c) 一個(gè)指向指針的的指針,它指向的指針是指向一個(gè)整型數(A pointer to a pointer to an integer)
d) 一個(gè)有10個(gè)整型數的數組(An array of 10 integers)
e) 一個(gè)有10個(gè)指針的數組,該指針是指向一個(gè)整型數的(An array of 10 pointers to integers)
f) 一個(gè)指向有10個(gè)整型數數組的指針(A pointer to an array of 10 integers)
g) 一個(gè)指向函數的指針,該函數有一個(gè)整型參數并返回一個(gè)整型數(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一個(gè)有10個(gè)指針的數組,該指針指向一個(gè)函數,該函數有一個(gè)整型參數并返回一個(gè)整型數( An array of ten pointers to functions that take an integer argument and return an integer )
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
2)關(guān)鍵字const有什么含意?答:表示常量不可以修改的變量。
答案:#ifdef __cplusplus
cout<<"c++";
#else
cout<<"c";
#endif
答案:如果數就是1-N-1,那么求出a[N]的和,然后減去1-N-1就行了。(確定數字1-N)
S = N * (N-1) / 2;
int i;
int s = 0;
for(i=0;i<>
{
s += a[i];
}
int res = s – S;
char * const p;
charconst * p
const char *p
上述三個(gè)有什么區別?
答:char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和char const *p
#include
int main()
{
int a[] = {10,6,9,5,2,8,4,7,1,3};
intlen = sizeof(a) / sizeof(int);
int temp;
for(int i = 0; i
{
temp = a[a[i] – 1];
a[a[i] – 1] = a[i];
a[i] = temp;
if ( a[i] == i + 1)
i++;
}
for (int j = 0; j
cout<<><>
return 0;
}
intstrcmp ( const char * src,const char * dst)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src – *(unsigned char *)dst) && *dst)//字符之差為整型
{
++src;
++dst;
}
if ( ret < 0 ) ret = -1 ; else if ( ret > 0 )
ret = 1 ;
return( ret );
}
答: #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
#definedPSstruct s *
typedefstruct s * tPS;
以上兩種情況的意圖都是要定義dPS和tPS作為一個(gè)指向結構s指針。哪種方法更好呢?(如果有的話(huà))為什么?
答:typedef更好。思考下面的例子:
dPS p1,p2;tPS p3,p4;
第一個(gè)擴展為:struct s * p1, p2;
上面的代碼定義p1為一個(gè)指向結構的指,p2為一個(gè)實(shí)際的結構,這也許不是你想要的。第二個(gè)例子正確地定義了p3 和p4 兩個(gè)指針。
int a = 5, b = 7, c;
c = a+++b;
答:上面的代碼被處理成:c = a++ + b;因此, 這段代碼持行后a = 6, b = 7, c = 12。
sizeof(ss) 結果 4 //ss是指向字符串常量的字符指針
sizeof(*ss) 結果 1 //*ss是第一個(gè)字符
char ss[] = “0123456789″;
sizeof(ss) 結果 11 //ss是數組,計算到\0位置,因此是10+1
sizeof(*ss) 結果 1 //*ss是第一個(gè)字符
char ss[100] = “0123456789″;
sizeof(ss) 結果是100 //ss表示在內存中的大小 100×1
intss[100] = “0123456789″;
sizeof(ss) 結果 400 //ss表示再內存中的大小 100×4
char q[]=”abc”;
char p[]=”a\n”;
sizeof(q),sizeof(p),strlen(q),strlen(p); 結果是 4 3 3 2
void bubble_sort(int array[],int n)
{
inti,j,temp;
for(i = 0; i < n-1; i++)
{
for(j = 0; j < n-1-i; j++) { if(array[j] > array[j+1])
{ temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; }
}
printf(“%d “, array[j]);
}
return;
}
選擇排序法:
main()
{
int a[10];
inti,j,t,k;
for ( i = 0; i < 10; i ++ )
scanf(“%d”,&a[ i ]); //輸入10個(gè)數
for ( i = 0; i < 9; i ++ )
{
k = i;
for ( j = i + 1; j < 10; j ++) if ( a[ k ] > a[ j ] )
k = j; //前進(jìn)
if (k!=i)
{ t = a[ i ]; a[ i ] = a[ k ]; a[ k ] = t; }/* t 發(fā)放獎品*/
}
for( i = 9; i >= 0; i –)
printf(“%4d”,a[ i ]); /*顯示排序后的結果*/
}
聯(lián)系客服