1.static關(guān)鍵字的作用?
1)第一個(gè)作用:隱藏。當(dāng)我們同時(shí)編譯多個(gè)文件時(shí),所有未加static前綴的全局變量和函數(shù)都具有全局可見性。
2)static的第二個(gè)作用是保持變量內(nèi)容的持久。存儲(chǔ)在靜態(tài)數(shù)據(jù)區(qū)的變量會(huì)在程序剛開始運(yùn)行時(shí)就完成初始化,也是唯一的一次初始化。共有兩種變量存儲(chǔ)在靜態(tài)存儲(chǔ)區(qū):全局變量和static變量,只不過和全局變量比起來,static可以控制變量的可見范圍,說到底static還是用來隱藏的。
3)static的第三個(gè)作用是默認(rèn)初始化為0。其實(shí)全局變量也具備這一屬性,因?yàn)槿肿兞恳泊鎯?chǔ)在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū),內(nèi)存中所有的字節(jié)默認(rèn)值都是0x00,某些時(shí)候這一特點(diǎn)可以減少程序員的工作量。
2.線程與進(jìn)程的區(qū)別和聯(lián)系?
一個(gè)進(jìn)程可以有一個(gè)或者多個(gè)線程組成,
進(jìn)程和程序并不是一一對(duì)應(yīng)的,一個(gè)程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的進(jìn)程,可以用進(jìn)程控制塊來唯一地標(biāo)識(shí)每個(gè)進(jìn)程。而這一點(diǎn)正是程序無法做到的,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序,他們的指令的集合依然是一樣的,所以無法唯一地標(biāo)識(shí)出這些運(yùn)行于不同數(shù)據(jù)集上的程序。一般來說,一個(gè)進(jìn)程肯定有一個(gè)與之對(duì)應(yīng)的程序,而且只有一個(gè)。而一個(gè)程序有可能沒有與之對(duì)應(yīng)的進(jìn)程(因?yàn)樗鼪]有執(zhí)行),也有可能有多個(gè)進(jìn)程與之對(duì)應(yīng)(運(yùn)行在幾個(gè)不同的數(shù)據(jù)集上)。
3.堆和棧的區(qū)別?
1)、棧區(qū)(stack)―由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
2)、堆區(qū)(heap)―一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。
4.C語言如何判斷兩個(gè)單向無環(huán)鏈表是否相交?
只需判斷兩個(gè)鏈表的尾節(jié)點(diǎn)地址是否相同,相同則相交,不同則不相交
5.程序在內(nèi)存中運(yùn)行時(shí),內(nèi)存分幾個(gè)區(qū),各自用途?
1)棧--有編譯器自動(dòng)分配釋放2.堆--一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收3.全局區(qū)(靜態(tài)區(qū))--全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊
的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。程序結(jié)束釋放。4.另外還有一個(gè)專門放常量的地方。程序結(jié)束釋放。
6.引用與指針有什么區(qū)別
指針指向一塊內(nèi)存,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名
1.指針是一個(gè)實(shí)體,而引用僅是個(gè)別名;
2.引用使用時(shí)無需解引用(*),指針需要解引用;
3.引用只能在定義時(shí)被初始化一次,之后不可變;指針可變;
4.引用沒有const,指針有const;
5.引用不能為空,指針可以為空;
6.“sizeof引用”得到的是所指向的變量(對(duì)象)的大小,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大??;
7.指針和引用的自增(++)運(yùn)算意義不一樣;
8.從內(nèi)存分配上看:程序?yàn)橹羔樧兞糠峙鋬?nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域。
7.
編程:
1.請(qǐng)問運(yùn)行完Test函數(shù)后,會(huì)有什么樣的結(jié)果。
(1)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?
答:程序崩潰。
因?yàn)?b>GetMemory并不能傳遞動(dòng)態(tài)內(nèi)存,
Test函數(shù)中的str一直都是NULL。
strcpy(str, "hello world");將使程序崩潰。
(2)
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?
(2)答:可能是亂碼。
因?yàn)镚etMemory返回的是指向“棧內(nèi)存”的指針,該指針的地址不是NULL,但其原現(xiàn)的內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。
(3)
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?
答:
(1)能夠輸出hello
(2)內(nèi)存泄漏
(4)
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str,“hello”);
free(str);
if(str !=NULL)
{
strcpy(str,“world”);
printf(str);
}
}
請(qǐng)問運(yùn)行Test函數(shù)會(huì)有什么樣的結(jié)果?
答:篡改動(dòng)態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料,非常危險(xiǎn)。
因?yàn)閒ree(str);之后,str成為野指針,
if(str != NULL)語句不起作用。
2.編寫strcpy函數(shù)(10分)
已知strcpy函數(shù)的原型是
char*strcpy(char *strDest, const char *strSrc);
其中strDest是目的字符串,strSrc是源字符串。
(1)不調(diào)用C++/C的字符串庫函數(shù),請(qǐng)編寫函數(shù)strcpy
char *strcpy(char*strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc!=NULL));
char *address =strDest;
while( (*strDest++ = *strSrc++) !=‘\0’)
NULL ;
returnaddress ;
}
(2)strcpy能把strSrc的內(nèi)容復(fù)制到strDest,為什么還要char *類型的返回值?
答:為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)式。
例如intlength = strlen( strcpy( strDest,“hello world”));
3.#include
intmain()
{
inta =0x0101;
intb =0x0202;
intc;
c = a&(~b);
c = c|b;
printf("%x,%d\n",c,c);
return0;
}
答案:303,771
4.完成下面函數(shù)以實(shí)現(xiàn)使用輾轉(zhuǎn)相除法獲取兩個(gè)數(shù)(假設(shè)兩個(gè)數(shù)都大于0)的最大公約數(shù)
example:gcd(20,5 ) = 5.gcd(3,10 ) = 1.gcd(1620,1280 ) = 20.
unsigned int gcd(unsignedint
a,unsigned
int b)
{
intc=0;
if(m%n==0) c =n;
else
c=gcd(n,m%n);
returnc;
}
5.用嵌套方式寫一個(gè)函數(shù),函數(shù)返回N的階層,要求盡量寫完整
int fun(int n)
{
if (n ==1)
returnn;
returnn*(n-1);
}
6.請(qǐng)寫出下列數(shù)據(jù)類型的范圍char,unsigned char,short,int
答:char(-127~128)unsigned char(0~255)short(-2^16-1 ~2^16)int(-32768~32767)
7.請(qǐng)寫出下面函數(shù)的返回值
char fuc1(){
unsigned int a = 6;
int b = -12;
return(a+b>6)?1:0
}
#define SQP(x)(x*x)
int fuc2()
{
int a = 3;
return SQR(a+2);
}
答:111
8.請(qǐng)計(jì)算下列結(jié)構(gòu)所占字節(jié)數(shù)
Typedef structYouKnoow
{
int id;
short age;
char level;
}
答:8
9.關(guān)鍵字const有什么含義?
const修飾誰,誰在整個(gè)程序運(yùn)行過程中不能變
10.下方代碼輸出結(jié)果為
main()
{
int a[5] = {1, 2,3, 4, 5};
int *ptr = (int*)(&a+1);
printf(“%d%d”, *(a+1), *(ptr-1));
}
答:D:4, 5
11.用c/c++實(shí)現(xiàn)冒泡排序
voidswap_sort(int *p, int n) {
intI, j;
inttmp;
for(i=0;i
for(j=0;j
if(p[j]>p[j+1]){
tmp=p[j];
p[j]=p[j+1];
p[j+1]=tmp;
}
}
}
}
12.用嵌套的方式寫一個(gè)函數(shù),該函數(shù)返回N的階乘(N!=1*2*..*N)
int func(int n){if (n==1) return 1; return n * x(n-1);}