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