1.static關(guān)鍵字的作用藤为?
1)第一個作用:隱藏换帜。當(dāng)我們同時編譯多個文件時腊敲,所有未加static前綴的全局變量和函數(shù)都具有全局可見性叹括。
2)static的第二個作用是保持變量內(nèi)容的持久瀑晒。存儲在靜態(tài)數(shù)據(jù)區(qū)的變量會在程序剛開始運行時就完成初始化绍坝,也是唯一的一次初始化。共有兩種變量存儲在靜態(tài)存儲區(qū):全局變量和static變量苔悦,只不過和全局變量比起來轩褐,static可以控制變量的可見范圍,說到底static還是用來隱藏的玖详。
3)static的第三個作用是默認初始化為0把介。其實全局變量也具備這一屬性勤讽,因為全局變量也存儲在靜態(tài)數(shù)據(jù)區(qū)。在靜態(tài)數(shù)據(jù)區(qū)拗踢,內(nèi)存中所有的字節(jié)默認值都是0x00脚牍,某些時候這一特點可以減少程序員的工作量。
2.線程與進程的區(qū)別和聯(lián)系巢墅?
一個進程可以有一個或者多個線程組成,
進程和程序并不是一一對應(yīng)的诸狭,一個程序執(zhí)行在不同的數(shù)據(jù)集上就成為不同的進程,可以用進程控制塊來唯一地標(biāo)識每個進程君纫。而這一點正是程序無法做到的驯遇,由于程序沒有和數(shù)據(jù)產(chǎn)生直接的聯(lián)系,既使是執(zhí)行不同的數(shù)據(jù)的程序蓄髓,他們的指令的集合依然是一樣的叉庐,所以無法唯一地標(biāo)識出這些運行于不同數(shù)據(jù)集上的程序。一般來說双吆,一個進程肯定有一個與之對應(yīng)的程序眨唬,而且只有一個。而一個程序有可能沒有與之對應(yīng)的進程(因為它沒有執(zhí)行),也有可能有多個進程與之對應(yīng)(運行在幾個不同的數(shù)據(jù)集上)好乐。
3.堆和棧的區(qū)別匾竿?
1)、棧區(qū)(stack)―由編譯器自動分配釋放蔚万,存放函數(shù)的參數(shù)值岭妖,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧反璃。
2)昵慌、堆區(qū)(heap)―一般由程序員分配釋放,若程序員不釋放淮蜈,程序結(jié)束時可能由OS回收斋攀。
4.C語言如何判斷兩個單向無環(huán)鏈表是否相交?
只需判斷兩個鏈表的尾節(jié)點地址是否相同梧田,相同則相交淳蔼,不同則不相交
5.程序在內(nèi)存中運行時,內(nèi)存分幾個區(qū)裁眯,各自用途鹉梨?
1)棧--有編譯器自動分配釋放2.堆--一般由程序員分配釋放,若程序員不釋放穿稳,程序結(jié)束時可能由OS回收3.全局區(qū)(靜態(tài)區(qū))--全局變量和靜態(tài)變量的存儲是放在一塊
的存皂,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域逢艘。程序結(jié)束釋放旦袋。4.另外還有一個專門放常量的地方骤菠。程序結(jié)束釋放。
6.引用與指針有什么區(qū)別
指針指向一塊內(nèi)存猜憎,它的內(nèi)容是所指內(nèi)存的地址娩怎;引用是某塊內(nèi)存的別名
1.指針是一個實體,而引用僅是個別名胰柑;
2.引用使用時無需解引用(*)截亦,指針需要解引用;
3.引用只能在定義時被初始化一次柬讨,之后不可變崩瓤;指針可變;
4.引用沒有const踩官,指針有const却桶;
5.引用不能為空,指針可以為空蔗牡;
6.“sizeof引用”得到的是所指向的變量(對象)的大小颖系,而“sizeof指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大小辩越;
7.指針和引用的自增(++)運算意義不一樣嘁扼;
8.從內(nèi)存分配上看:程序為指針變量分配內(nèi)存區(qū)域,而引用不需要分配內(nèi)存區(qū)域黔攒。
7.
編程:
1.請問運行完Test函數(shù)后趁啸,會有什么樣的結(jié)果。
(1)
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
請問運行Test函數(shù)會有什么樣的結(jié)果督惰?
答:程序崩潰不傅。
因為GetMemory并不能傳遞動態(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);
}
請問運行Test函數(shù)會有什么樣的結(jié)果?
(2)答:可能是亂碼觉阅。
因為GetMemory返回的是指向“棧內(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);
}
請問運行Test函數(shù)會有什么樣的結(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);
}
}
請問運行Test函數(shù)會有什么樣的結(jié)果痴柔?
答:篡改動態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料疫向,非常危險咳蔚。
因為free(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ù)糯耍,請編寫函數(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 *類型的返回值?
答:為了實現(xiàn)鏈?zhǔn)奖磉_式温技。
例如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ù)以實現(xiàn)使用輾轉(zhuǎn)相除法獲取兩個數(shù)(假設(shè)兩個數(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.用嵌套方式寫一個函數(shù)革为,函數(shù)返回N的階層,要求盡量寫完整
int fun(int n)
{
if (n ==1)
returnn;
returnn*(n-1);
}
6.請寫出下列數(shù)據(jù)類型的范圍char,unsigned char,short,int
答:char(-127~128)unsigned char(0~255)short(-2^16-1 ~2^16)int(-32768~32767)
7.請寫出下面函數(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.請計算下列結(jié)構(gòu)所占字節(jié)數(shù)
Typedef structYouKnoow
{
int id;
short age;
char level;
}
答:8
9.關(guān)鍵字const有什么含義舵鳞?
const修飾誰震檩,誰在整個程序運行過程中不能變
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++實現(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.用嵌套的方式寫一個函數(shù),該函數(shù)返回N的階乘(N!=1*2*..*N)
int func(int n){if (n==1) return 1; return n * x(n-1);}