笔试总结2(整理 觉得比较好的)
static全局變量與普通的全局變量有什么區(qū)別:
static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區(qū)別:
static局部變量只被初始化一次,下一次依據(jù)上一次結(jié)果值;
static函數(shù)與普通函數(shù)有什么區(qū)別:
static函數(shù)在內(nèi)存中只有一份,普通函數(shù)在每個(gè)被調(diào)用中維持一份拷貝
2、程序的局部變量存在于(堆棧)中,全局變量存在于(靜態(tài)區(qū) )中,動(dòng)態(tài)申請(qǐng)數(shù)據(jù)存在于( 堆)中。
3、寫(xiě)出下列代碼的輸出內(nèi)容
#include <stdio.h>
int inc(int a)
?{ return(++a); }
?int multi(int*a,int*b,int*c)
?{ return(*c=*a**b); }
typedef int(FUNC1)(int in);
?typedef int(FUNC2) (int*,int*,int*);
void show(FUNC2 fun,int arg1, int*arg2)
{
? FUNC1 p=&inc;
int temp =p(arg1);
fun(&temp,&arg1, arg2);
printf("%dn",*arg2);
?}
?main()
?{
int a; ? ? ? //局部變量a為0;
show(multi,10,&a);
?return 0;
}
答:110
4、請(qǐng)找出下面代碼中的所有錯(cuò)誤 (題目不錯(cuò),值得一看)
說(shuō)明:以下代碼是把一個(gè)字符串倒序,如“abcd”倒序后變?yōu)椤癲cba”
#include"string.h"
main()
{
char*src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len); ??
char* d=dest;
char* s=src[len]; ? ? ? ??
while(len--!=0)
d++=s--; ? ? ??
printf("%s",dest);
return 0;
}
答:
方法1:一共有4個(gè)錯(cuò)誤;
int main()
{
char* src = "hello,world";
int len = strlen(src);
char* dest = (char*)malloc(len+1);//要為分配一個(gè)空間 char* d = dest;
char* s = &src[len-1]; ? ? ? ? ?//指向最后一個(gè)字符
while( len-- != 0 )
*d++=*s--;
*d = 0; ? ? ? ? ? //尾部要加’/0’
printf("%sn",dest);
free(dest); ? ? ? ?// 使用完,應(yīng)當(dāng)釋放空間,以免造成內(nèi)存匯泄露
dest = NULL; //防止產(chǎn)生野指針
return 0;
}
方法2: (方法一需要額外的存儲(chǔ)空間,效率不高.) 不錯(cuò)的想法
#include <stdio.h>
#include <string.h>
main()
{
char str[]="hello,world";
int len=strlen(str);
char t;
for(int i=0; i<len/2; i++)
{
t=str[i];
str[i]=str[len-i-1]; //小心一點(diǎn)
str[len-i-1]=t;
}
printf("%s",str);
return 0;
}
5、軟件測(cè)試都有那些種類?
黑盒:針對(duì)系統(tǒng)功能的測(cè)試
白盒:測(cè)試函數(shù)功能,各函數(shù)接口?
6、選擇題:
Ethternet鏈接到Internet用到以下那個(gè)協(xié)議? D
A.HDLC;B.ARP;C.UDP;D.TCP;E.ID
屬于網(wǎng)絡(luò)層協(xié)議的是:( B C)
? A.TCP;B.IP;C.ICMP;D.X.25
Windows消息調(diào)度機(jī)制是:(C)
A.指令隊(duì)列;B.指令堆棧;C.消息隊(duì)列;D.消息堆棧;
7、TCP/IP通信建立的過(guò)程怎樣,端口有什么作用?
三次握手,確定是哪個(gè)應(yīng)用程序使用該協(xié)議?
8、找錯(cuò)題
(1).#define Max_CB 500
void LmiQueryCSmd(Struct MSgCB * pmsg)
{
unsigned char ucCmdNum;
......
for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdNum++)
{
......;
}
答: 死循環(huán),unsigned int的取值范圍是0~255
8、Windows下的內(nèi)存是如何管理的?
? 分頁(yè)管理
9、什么是預(yù)編譯,何時(shí)需要預(yù)編譯:
答: 就是指程序執(zhí)行前的一些預(yù)處理工作,主要指#表示的.
何時(shí)需要預(yù)編譯?
1)、總是使用不經(jīng)常改動(dòng)的大型代碼體。
2)、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。
10、 下述三個(gè)有什么區(qū)別?
char * const p;
char const * p
const char *p
解答:
char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和char const *p
有以下表達(dá)式:
int a=248; b=4;int const c=21;const int *d=&a;
int *const e=&b;int const *f const =&a;
請(qǐng)問(wèn)下列表達(dá)式哪些會(huì)被編譯器禁止?為什么?
答:*c=32;d=&b;*d=43;e=34;e=&a;f=0x321f;
*c 這是個(gè)什么東東,禁止
*d 說(shuō)了是const, 禁止
e = &a 說(shuō)了是const 禁止
const *f const =&a; 禁止
11、以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?
void UpperCase( char str[] ) // 將 str 中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str[i] && str[i]<='z' )
str[i] -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符長(zhǎng)度為: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
答:函數(shù)內(nèi)的sizeof有問(wèn)題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為6,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒(méi)有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。
? ?注意:數(shù)組名作為函數(shù)參數(shù)時(shí),退化為指針.
? ? ? ? 數(shù)組名作為sizeof()參數(shù)時(shí),數(shù)組名不退化,因?yàn)閟izeof不是函數(shù).
12、請(qǐng)問(wèn)以下代碼有什么問(wèn)題:
1).
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
答;沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常
問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂贰km然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫(xiě)而導(dǎo)致程序崩潰。
Strcpy的在庫(kù)函數(shù)string.h中.程序的主要錯(cuò)誤在于越界進(jìn)行內(nèi)存讀寫(xiě)導(dǎo)致程序崩潰//
2).
char* s="AAA";
printf("%s",s);
s[0]='B';
printf("%s",s);
有什么錯(cuò)?
答: "AAA"是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問(wèn)題。
cosnt char* s="AAA";
然后又因?yàn)槭浅A?#xff0c;所以對(duì)是s[0]的賦值操作是不合法的。
13、寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
答:#define Min(X, Y) ((X)>(Y)?(Y):(X))?
14、(1)、關(guān)鍵字static的作用是什么?
答:1)定義靜態(tài)局部變量,作用域從函數(shù)開(kāi)始到結(jié)束.
?2) 在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi);
?3) 在類中的static成員變量屬于整個(gè)類所擁有,對(duì)類的所有對(duì)象只有一份拷貝
(2)、關(guān)鍵字const有什么含意?
答 :1)表示常量不可以修改的變量。
? ?2)可以修飾參數(shù),作為輸入?yún)?shù).
? ?3)修飾函數(shù),防止以外的改動(dòng).
? ?4)修飾類的成員函數(shù),不改變類中的數(shù)據(jù)成員.
(3)、關(guān)鍵字volatile有什么含意?并舉出三個(gè)不同的例子?
答: 提示編譯器對(duì)象的值可能在編譯器未監(jiān)測(cè)到的情況下改變。
? ?例子: 硬件時(shí)鐘;多線程中被多個(gè)任務(wù)共享的變量等
15、int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函數(shù)指針數(shù)組,每個(gè)指針指向一個(gè)int func(int param)的函數(shù)。
16、c和c++中的struct有什么不同?
答: c和c++中struct的主要區(qū)別是c中的struct不可以含有成員函數(shù),而c++中的struct可以。c++中struct和class的主要區(qū)別在于默認(rèn)的存取權(quán)限不同,struct默認(rèn)為public,而class默認(rèn)為private.
17、#include <stdio.h>
#include <stdlib.h>
void getmemory(char *p)
{
p=(char *) malloc(100);
}
int main( )
{
char *str=NULL;
getmemory(str);
strcpy(p,"hello world");
printf("%s/n",str);
free(str);
return 0;
}
答: 程序崩潰,getmemory中的malloc 不能返回動(dòng)態(tài)內(nèi)存, free()對(duì)str操作很危險(xiǎn)
18、char szstr[10];
strcpy(szstr,"0123456789");
產(chǎn)生什么結(jié)果?為什么?
答;正常輸出,長(zhǎng)度不一樣,會(huì)造成非法的OS,覆蓋別的內(nèi)容.
19、c指針
int *p[n];-----指針數(shù)組,每個(gè)元素均為指向整型數(shù)據(jù)的指針。
int (*p)[n];------p為指向一維數(shù)組的指針,這個(gè)一維數(shù)組有n個(gè)整型數(shù)據(jù)。
int *p();----------函數(shù)帶回指針,指針指向返回的值。
int (*p)();------p為指向函數(shù)的指針。
20、ASSERT()是干什么用的
答:ASSERT()是一個(gè)調(diào)試程序時(shí)經(jīng)常使用的宏,在程序運(yùn)行時(shí)它計(jì)算括號(hào)內(nèi)的表達(dá)式,如果表達(dá)式為FALSE (0), 程序?qū)?bào)告錯(cuò)誤,并終止執(zhí)行。如果表達(dá)式不為0,則繼續(xù)執(zhí)行后面的語(yǔ)句。這個(gè)宏通常原來(lái)判斷程序中是否出現(xiàn)了明顯非法的數(shù)據(jù),如果出現(xiàn)了終止程序以免導(dǎo)致嚴(yán)重后果,同時(shí)也便于查找錯(cuò)誤。例如,變量n在程序中不應(yīng)該為0,如果為0可能導(dǎo)致錯(cuò)誤,你可以這樣寫(xiě)程序:
......
ASSERT( n != 0);
k = 10/ n;
......
ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。assert()的功能類似,它是ANSI C標(biāo)準(zhǔn)中規(guī)定的函數(shù),它與ASSERT的一個(gè)重要區(qū)別是可以用在Release版本中。
21、system("pause");作用?
答:系統(tǒng)的暫停程序,按任意鍵繼續(xù),屏幕會(huì)打印,"按任意鍵繼續(xù)。。。。。" 省去了使用getchar();
22、請(qǐng)講一講析構(gòu)函數(shù)和虛函數(shù)的用法和作用?
答:析構(gòu)函數(shù)也是特殊的類成員函數(shù),它沒(méi)有返回類型,沒(méi)有參數(shù),不能隨意調(diào)用,也沒(méi)有重載。只是在類對(duì)象生命期結(jié)束的時(shí)候,由系統(tǒng)自動(dòng)調(diào)用釋放在構(gòu)造函數(shù)中分配的
資源。這種在運(yùn)行時(shí),能依據(jù)其類型確認(rèn)調(diào)用那個(gè)函數(shù)的能力稱為多態(tài)性,或稱遲后聯(lián)編。另: 析構(gòu)函數(shù)一般在對(duì)象撤消前做收尾工作,比如回收內(nèi)存等工作,虛擬函數(shù)的功能是使子類可以用同名的函數(shù)對(duì)父類函數(shù)進(jìn)行覆蓋,并且在調(diào)用時(shí)自動(dòng)調(diào)用子類覆蓋函數(shù),如果是純虛函數(shù),則純粹是為了在子類覆蓋時(shí)有個(gè)統(tǒng)一的命名而已。
注意:子類重新定義父類的虛函數(shù)的做法叫覆蓋,override,而不是overload(重載),重載的概念不屬于面向?qū)ο缶幊?重載指的是存在多個(gè)同名函數(shù),這些函數(shù)的參數(shù)表不同..重載是在編譯期間就決定了的,是靜態(tài)的,因此,重載與多態(tài)無(wú)關(guān).與面向?qū)ο缶幊虩o(wú)關(guān).含有純虛函數(shù)的類稱為抽象類,不能實(shí)例化對(duì)象,主要用作接口類//
23、全局變量和局部變量有什么區(qū)別?是怎么實(shí)現(xiàn)的?操作系統(tǒng)和編譯器是怎么知道的?
答;全局變量的生命周期是整個(gè)程序運(yùn)行的時(shí)間,而局部變量的生命周期則是局部函數(shù)或過(guò)程調(diào)用的時(shí)間段。其實(shí)現(xiàn)是由編譯器在編譯時(shí)采用不同內(nèi)存分配方法。
全局變量在main函數(shù)調(diào)用后,就開(kāi)始分配,靜態(tài)變量則是在main函數(shù)前就已經(jīng)初始化了。
局部變量則是在用戶棧中動(dòng)態(tài)分配的(還是建議看編譯原理中的活動(dòng)記錄這一塊)
24、c語(yǔ)言 文件讀寫(xiě)
#include "stdio.h"
main()
{
FILE *fp;
char ch,filename[10];
scanf("%s",filename);
if((fp=fopen(filename,"w")==NULL)
{
printf("cann't open filen");
exit(0);
}
ch=getchar();
while(ch!='#')
{
fputc(ch,fp);
putchar(ch);
ch=getchar();
}
fclose(fp);
}
25、winsocket編程 ? //這個(gè)不錯(cuò)
// 服務(wù)器代碼
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD wVersionRequested; //版本號(hào)
WSADATA ?wsaData; ? ? ? ?//數(shù)據(jù)
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData);
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0); //建立套接字
SOCKADDR_IN addrSrv;?
addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
addrSrv.sin_family=AF_INET;
addrSrv.sin_port=htons(6000);
bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); ?//綁定端口
listen(sockSrv,5); ? //轉(zhuǎn)換socket套接子為偵聽(tīng)套接子
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
while(1) ? //無(wú)限循環(huán)
{
SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);
char sendBuf[100];
sprint(sendBuf,"Welcome %s to http://www.sunxin.org",
inet_ntoa(addrClient.sin_addr));
send(sockConn,sendBuf,strlen(sendBuf)+1,0);
char recvBuf[100];
recv(sockConn,recvBuf);
printf("%sn",recvBuf);
closesocket(sockConn);
WSACleanup();
}
}
注:這是Server端;File->New->Win32 Console Application,工程名:TcpSrv;然后,File->New->C++ Source File,文件名:TcpSrv;在該工程的Setting的Link的Object/library modules項(xiàng)要加入ws2_32.lib
#include <Winsock2.h>
#include <stdio.h>
void main()
{
WORD ? ?wVersionRequested;
WSADATA ? wsaData;
int err;
wVersionRequested = MAKEWORD(1,1);
err = WSAStartup(wVersionRequested,&wsaData); //啟動(dòng)winsock Dll
if( err != 0)
{
return;
}
if(LOBYTE( wsaData.wVersion ) != 1||
HIBYTE( wsaData.wVersion) != 1)
{
WSACleanup();
return;
}
SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
addrSrv.sin_family=AF_INET;
addrSrv.sin_port = htons(6000);
connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));
char recvBuf[100];
recv(sockClient,recvBuf,100,0);
printf("%sn",recvBuf);
send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);
closesocket(sockClient);
WSACleanup();
}
注:這是Client端;File->New->Win32 Console Application,工程名:TcpClient;然后,File->New->C++ Source File,文件名:TcpClient;同理,在該工程的Setting的Link的Object/library modules項(xiàng)要加入ws2_32.lib
26、 類的知識(shí) (非常不錯(cuò)的一道題目)..
C++
#include <iostream.h>
class human
{
public:
human(){ human_num++;}; //默認(rèn)構(gòu)造函數(shù)
static int human_num; ? ? //靜態(tài)成員
~human()
{
human_num--;
print();
}
void print() ? ? ? ? ? ? //
{
cout<<"human num is: "<<human_num<<endl;
}
protected:
private:
};
int human::human_num = 0; ? //類中靜態(tài)數(shù)據(jù)成員在外部定義,僅定義一次
human f1(human x)
{
x.print();
return x;
}
int main(int argc, char* argv[])
{
human h1; //調(diào)用默認(rèn)構(gòu)造函數(shù),human_num變?yōu)?
h1.print(); // 打印Human_man:1
human h2 = f1(h1); //先調(diào)用函數(shù)f1(),輸出human_num:1,而后輸出human_num為0,
h2.print();//打印輸出:human_num:0
return 0;
} //依次調(diào)用兩個(gè)析構(gòu)函數(shù):輸出:human_num:-1,human_num:-2;
輸出:
1
1
0
0
-1
-2
----------------------------
分析:
human h1; //調(diào)用構(gòu)造函數(shù),---hum_num = 1;
h1.print(); //輸出:"human is 1"
human h2 = f1(h1); //再調(diào)用f1(h1)的過(guò)程中,由于函數(shù)參數(shù)是按值傳遞對(duì)象,調(diào)用默認(rèn)的復(fù)制構(gòu)造函數(shù),h2并沒(méi)有調(diào)用定義的構(gòu)造函數(shù).
總結(jié)
以上是生活随笔為你收集整理的笔试总结2(整理 觉得比较好的)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 笔试总结1
- 下一篇: C/C++ 程序设计员应聘常见面试试题深