c/c++面试试题(三)
慧通:
什么是預(yù)編譯
何時(shí)需要預(yù)編譯:
1、總是使用不經(jīng)常改動(dòng)的大型代碼體。 
2、程序由多個(gè)模塊組成,所有模塊都使用一組標(biāo)準(zhǔn)的包含文件和相同的編譯選項(xiàng)。在這種情況下,可以將所有包含文件預(yù)編譯為一個(gè)預(yù)編譯頭。
char * const p;
char const * p
const char *p
上述三個(gè)有什么區(qū)別?
char * const p; //常量指針,p的值不可以修改
char const * p;//指向常量的指針,指向的常量值不可以改
const char *p; //和char const *p
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
結(jié)果是:0 0 1 1
解答:str1,str2,str3,str4是數(shù)組變量,它們有各自的內(nèi)存空間;
而str5,str6,str7,str8是指針,它們指向相同的常量區(qū)域。
12. 以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?[C易]
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。
一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位
指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(jié)了。
main()
{
? int a[5]={1,2,3,4,5};
?? int *ptr=(int *)(&a+1);
?? printf("%d,%d",*(a+1),*(ptr-1));
}
輸出:2,5
*(a+1)就是a[1],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5
&a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int)
int *ptr=(int *)(&a+1); 
則ptr實(shí)際是&(a[5]),也就是a+5
原因如下:
&a是數(shù)組指針,其類型為 int (*)[5];
而指針加1要根據(jù)指針類型加上一定的值,
不同類型的指針+1之后增加的大小不同
a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int)
所以ptr實(shí)際是a[5]
但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要)
所以prt-1只會(huì)減去sizeof(int*)
a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5].
1.請(qǐng)問(wèn)以下代碼有什么問(wèn)題:
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)致程序崩潰。
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]的賦值操作是不合法的。
1、寫(xiě)一個(gè)“標(biāo)準(zhǔn)”宏,這個(gè)宏輸入兩個(gè)參數(shù)并返回較小的一個(gè)。
.#define Min(X, Y) ((X)>(Y)?(Y):(X))//結(jié)尾沒(méi)有;
2、嵌入式系統(tǒng)中經(jīng)常要用到無(wú)限循環(huán),你怎么用C編寫(xiě)死循環(huán)。
while(1){}或者for(;;)
3、關(guān)鍵字static的作用是什么?
定義靜態(tài)變量
4、關(guān)鍵字const有什么含意?
表示常量不可以修改的變量。
5、關(guān)鍵字volatile有什么含意?并舉出三個(gè)不同的例子?
提示編譯器對(duì)象的值可能在編譯器未監(jiān)測(cè)到的情況下改變。
int (*s[10])(int) 表示的是什么啊
int (*s[10])(int) 函數(shù)指針數(shù)組,每個(gè)指針指向一個(gè)int func(int param)的函數(shù)。
1.有以下表達(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; 禁止
2.交換兩個(gè)變量的值,不使用第三個(gè)變量。即a=3,b=5,交換之后a=5,b=3;
有兩種解法, 一種用算術(shù)算法, 一種用^(異或)
a = a + b;
b = a - b;
a = a - b; 
or
a = a^b;// 只能對(duì)int,char..
b = a^b;
a = a^b;
or
a ^= b ^= a;
3.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
4.#include <stdio.h>
? #include <stdlib.h>
? void getmemory(char *p)
? {
??? p=(char *) malloc(100);
??? strcpy(p,"hello world");
? }
? int main( )
? {
??? char *str=NULL;
??? getmemory(str);
??? printf("%s/n",str);
??? free(str);
??? return 0;
?? }
程序崩潰,getmemory中的malloc 不能返回動(dòng)態(tài)內(nèi)存, free()對(duì)str操作很危險(xiǎn)
5.char szstr[10];
? strcpy(szstr,"0123456789");
? 產(chǎn)生什么結(jié)果?為什么?
? 長(zhǎng)度不一樣,會(huì)造成非法的OS
6.列舉幾種進(jìn)程的同步機(jī)制,并比較其優(yōu)缺點(diǎn)。
?? 原子操作 
信號(hào)量機(jī)制
?? 自旋鎖
?? 管程,會(huì)合,分布式系統(tǒng)
7.進(jìn)程之間通信的途徑
共享存儲(chǔ)系統(tǒng)
消息傳遞系統(tǒng)
管道:以文件系統(tǒng)為基礎(chǔ)
11.進(jìn)程死鎖的原因
資源競(jìng)爭(zhēng)及進(jìn)程推進(jìn)順序非法
12.死鎖的4個(gè)必要條件
互斥、請(qǐng)求保持、不可剝奪、環(huán)路
13.死鎖的處理
鴕鳥(niǎo)策略、預(yù)防策略、避免策略、檢測(cè)與解除死鎖
15.?? 操作系統(tǒng)中進(jìn)程調(diào)度策略有哪幾種?
FCFS(先來(lái)先服務(wù)),優(yōu)先級(jí),時(shí)間片輪轉(zhuǎn),多級(jí)反饋
8.類的靜態(tài)成員和非靜態(tài)成員有何區(qū)別?
類的靜態(tài)成員每個(gè)類只有一個(gè),非靜態(tài)成員每個(gè)對(duì)象一個(gè)
9.純虛函數(shù)如何定義?使用時(shí)應(yīng)注意什么?
virtual void f()=0;
是接口,子類必須要實(shí)現(xiàn)
10.數(shù)組和鏈表的區(qū)別
數(shù)組:數(shù)據(jù)順序存儲(chǔ),固定大小
連表:數(shù)據(jù)可以隨機(jī)存儲(chǔ),大小可動(dòng)態(tài)改變
12.ISO的七層模型是什么?tcp/udp是屬于哪一層?tcp/udp有何優(yōu)缺點(diǎn)?
應(yīng)用層
表示層
會(huì)話層
運(yùn)輸層
網(wǎng)絡(luò)層
物理鏈路層
物理層
tcp /udp屬于運(yùn)輸層
TCP 服務(wù)提供了數(shù)據(jù)流傳輸、可靠性、有效流控制、全雙工操作和多路復(fù)用技術(shù)等。
與 TCP 不同, UDP 并不提供對(duì) IP 協(xié)議的可靠機(jī)制、流控制以及錯(cuò)誤恢復(fù)功能等。由于 UDP 比較簡(jiǎn)單, UDP 頭包含很少的字節(jié),比 TCP 負(fù)載消耗少。
tcp: 提供穩(wěn)定的傳輸服務(wù),有流量控制,缺點(diǎn)是包頭大,冗余性不好
udp: 不提供穩(wěn)定的服務(wù),包頭小,開(kāi)銷小?? 
1:(void *)ptr 和 (*(void**))ptr的結(jié)果是否相同?其中ptr為同一個(gè)指針
.(void *)ptr 和 (*(void**))ptr值是相同的
2:int main()
?? {
??? int x=3;
??? printf("%d",x);
??? return 1;
?? 
?? }
問(wèn)函數(shù)既然不會(huì)被其它函數(shù)調(diào)用,為什么要返回1?
mian中,c標(biāo)準(zhǔn)認(rèn)為0表示成功,非0表示錯(cuò)誤。具體的值是某中具體出錯(cuò)信息
1,要對(duì)絕對(duì)地址0x100000賦值,我們可以用
(unsigned int*)0x100000 = 1234;
那么要是想讓程序跳轉(zhuǎn)到絕對(duì)地址是0x100000去執(zhí)行,應(yīng)該怎么做?
*((void (*)( ))0x100000 ) ( );
首先要將0x100000強(qiáng)制轉(zhuǎn)換成函數(shù)指針,即:
(void (*)())0x100000
然后再調(diào)用它:
*((void (*)())0x100000)();
用typedef可以看得更直觀些:
typedef void(*)() voidFuncPtr;
*((voidFuncPtr)0x100000)();
2,已知一個(gè)數(shù)組table,用一個(gè)宏定義,求出數(shù)據(jù)的元素個(gè)數(shù)
#define NTBL
#define NTBL (sizeof(table)/sizeof(table[0]))
面試題: 線程與進(jìn)程的區(qū)別和聯(lián)系? 線程是否具有相同的堆棧? dll是否有獨(dú)立的堆棧?
進(jìn)程是死的,只是一些資源的集合,真正的程序執(zhí)行都是線程來(lái)完成的,程序啟動(dòng)的時(shí)候操作系統(tǒng)就幫你創(chuàng)建了一個(gè)主線程。
每個(gè)線程有自己的堆棧。
DLL中有沒(méi)有獨(dú)立的堆棧,這個(gè)問(wèn)題不好回答,或者說(shuō)這個(gè)問(wèn)題本身是否有問(wèn)題。因?yàn)镈LL中的代碼是被某些線程所執(zhí)行,只有線程擁有堆棧,如果DLL中的代碼是EXE中的線程所調(diào)用,那么這個(gè)時(shí)候是不是說(shuō)這個(gè)DLL沒(méi)有自己獨(dú)立的堆棧?如果DLL中的代碼是由DLL自己創(chuàng)建的線程所執(zhí)行,那么是不是說(shuō)DLL有獨(dú)立的堆棧?
以上講的是堆棧,如果對(duì)于堆來(lái)說(shuō),每個(gè)DLL有自己的堆,所以如果是從DLL中動(dòng)態(tài)分配的內(nèi)存,最好是從DLL中刪除,如果你從DLL中分配內(nèi)存,然后在EXE中,或者另外一個(gè)DLL中刪除,很有可能導(dǎo)致程序崩潰
unsigned short A = 10;
printf("~A = %u/n", ~A);
char c=128; 
printf("c=%d/n",c);
輸出多少?并分析過(guò)程
第一題,~A =0xfffffff5,int值 為-11,但輸出的是uint。所以輸出4294967285
第二題,c=0x10,輸出的是int,最高位為1,是負(fù)數(shù),所以它的值就是0x00的補(bǔ)碼就是128,所以輸出-128。
這兩道題都是在考察二進(jìn)制向int或uint轉(zhuǎn)換時(shí)的最高位處理。
分析下面的程序:
void GetMemory(char **p,int num)
{
??? *p=(char *)malloc(num);
??? 
}??????? 
int main()
{
??? char *str=NULL;
??? 
??? GetMemory(&str,100);
??? 
??? strcpy(str,"hello");
??? 
??? free(str);
??? 
??? if(str!=NULL)
??? {
??????? strcpy(str,"world");
??? }??? 
??????? 
??? printf("/n str is %s",str);
??? getchar();
}??? 
問(wèn)輸出結(jié)果是什么?希望大家能說(shuō)說(shuō)原因,先謝謝了
輸出str is world。
free 只是釋放的str指向的內(nèi)存空間,它本身的值還是存在的.
所以free之后,有一個(gè)好的習(xí)慣就是將str=NULL.
此時(shí)str指向空間的內(nèi)存已被回收,如果輸出語(yǔ)句之前還存在分配空間的操作的話,這段存儲(chǔ)空間是可能被重新分配給其他變量的,
盡管這段程序確實(shí)是存在大大的問(wèn)題(上面各位已經(jīng)說(shuō)得很清楚了),但是通常會(huì)打印出world來(lái)。
這是因?yàn)?#xff0c;進(jìn)程中的內(nèi)存管理一般不是由操作系統(tǒng)完成的,而是由庫(kù)函數(shù)自己完成的。
當(dāng)你malloc一塊內(nèi)存的時(shí)候,管理庫(kù)向操作系統(tǒng)申請(qǐng)一塊空間(可能會(huì)比你申請(qǐng)的大一些),然后在這塊空間中記錄一些管理信息(一般是在你申請(qǐng)的內(nèi)存前面一點(diǎn)),并將可用內(nèi)存的地址返回。但是釋放內(nèi)存的時(shí)候,管理庫(kù)通常都不會(huì)將內(nèi)存還給操作系統(tǒng),因此你是可以繼續(xù)訪問(wèn)這塊地址的,只不過(guò)。。。。。。。。樓上都說(shuō)過(guò)了,最好別這么干。
char a[10],strlen(a)為什么等于15?運(yùn)行的結(jié)果
#include "stdio.h"
#include "string.h"
void main()
{
char aa[10];
printf("%d",strlen(aa));
}
sizeof()和初不初始化,沒(méi)有關(guān)系;
strlen()和初始化有關(guān)。
char (*str)[20];/*str是一個(gè)數(shù)組指針,即指向數(shù)組的指針.*/
char *str[20];/*str是一個(gè)指針數(shù)組,其元素為指針型數(shù)據(jù).*/
long a=0x801010;
a+5=?
0x801010用二進(jìn)制表示為:“1000 0000 0001 0000 0001 0000”,十進(jìn)制的值為8392720,再加上5就是8392725羅
1)給定結(jié)構(gòu)struct A 
{
?????? char t:4;
?????? char k:4;
?????? unsigned short i:8;
?????? unsigned long m;
};問(wèn)sizeof(A) = ?
給定結(jié)構(gòu)struct A 
{
?????? char t:4; 4位
?????? char k:4; 4位
?????? unsigned short i:8; 8位????? 
?????? unsigned long m; // 偏移2字節(jié)保證4字節(jié)對(duì)齊
}; // 共8字節(jié)
2)下面的函數(shù)實(shí)現(xiàn)在一個(gè)數(shù)上加一個(gè)數(shù),有什么錯(cuò)誤?請(qǐng)改正。
int add_n ( int n )
{
??? static int i = 100;
??? i += n;
??? return i;
}
當(dāng)你第二次調(diào)用時(shí)得不到正確的結(jié)果,難道你寫(xiě)個(gè)函數(shù)就是為了調(diào)用一次?問(wèn)題就出在 static上?
// 幫忙分析一下
#include<iostream.h>
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct? AA
{
??????? int b1:5;
??????? int b2:2;
}AA;
void main()
{
??????? AA aa;
??????? char cc[100];
???????? strcpy(cc,"0123456789abcdefghijklmnopqrstuvwxyz");
?????? memcpy(&aa,cc,sizeof(AA));
??????? cout << aa.b1 <<endl;
??????? cout << aa.b2 <<endl;
}
答案是 -16和1
首先sizeof(AA)的大小為4,b1和b2分別占5bit和2bit.
經(jīng)過(guò)strcpy和memcpy后,aa的4個(gè)字節(jié)所存放的值是:
0,1,2,3的ASC碼,即00110000,00110001,00110010,00110011
所以,最后一步:顯示的是這4個(gè)字節(jié)的前5位,和之后的2位
分別為:10000,和01
因?yàn)閕nt是有正負(fù)之分  所以:答案是-16和1
求函數(shù)返回值,輸入x=9999; 
int func ( x )
{ 
??? int countx = 0; 
??? while ( x ) 
??? { 
??????? countx ++; 
??????? x = x&(x-1); 
??? } 
??? return countx; 
} 
結(jié)果呢?
知道了這是統(tǒng)計(jì)9999的二進(jìn)制數(shù)值中有多少個(gè)1的函數(shù),且有
9999=9×1024+512+256+15
9×1024中含有1的個(gè)數(shù)為2;
512中含有1的個(gè)數(shù)為1;
256中含有1的個(gè)數(shù)為1;
15中含有1的個(gè)數(shù)為4;
故共有1的個(gè)數(shù)為8,結(jié)果為8。
1000 - 1 = 0111,正好是原數(shù)取反。這就是原理。
用這種方法來(lái)求1的個(gè)數(shù)是很效率很高的。
不必去一個(gè)一個(gè)地移位。循環(huán)次數(shù)最少。
int a,b,c 請(qǐng)寫(xiě)函數(shù)實(shí)現(xiàn)C=a+b ,不可以改變數(shù)據(jù)類型,如將c改為long int,關(guān)鍵是如何處理溢出問(wèn)題
bool add (int a, int b,int *c)
{
*c=a+b;
return (a>0 && b>0 &&(*c<a || *c<b) || (a<0 && b<0 &&(*c>a || *c>b)));
}
分析:
struct bit 
{?? int a:3; 
??? int? b:2; 
??? int c:3; 
}; 
int main() 
{ 
? bit s; 
? char *c=(char*)&s; 
?? cout<<sizeof(bit)<<endl;
? *c=0x99;
?? cout << s.a <<endl <<s.b<<endl<<s.c<<endl; 
???? int a=-1;
?? printf("%x",a);
? return 0; 
} 
輸出為什么是
4
1
-1
-4
ffffffff
因?yàn)?x99在內(nèi)存中表示為 100 11 001 , a = 001, b = 11, c = 100
當(dāng)c為有符合數(shù)時(shí), c = 100, 最高1為表示c為負(fù)數(shù),負(fù)數(shù)在計(jì)算機(jī)用補(bǔ)碼表示,所以c = -4;同理 
b = -1;
當(dāng)c為有符合數(shù)時(shí), c = 100,即 c = 4,同理 b = 3
位域 :?? 
有些信息在存儲(chǔ)時(shí),并不需要占用一個(gè)完整的字節(jié), 而只需占幾個(gè)或一個(gè)二進(jìn)制位。例如在存放一個(gè)開(kāi)關(guān)量時(shí),只有0和1 兩種狀態(tài), 用一位二進(jìn)位即可。為了節(jié)省存儲(chǔ)空間,并使處理簡(jiǎn)便,C語(yǔ)言又提供了一種數(shù)據(jù)結(jié)構(gòu),稱為“位域”或“位段”。所謂“位域”是把一個(gè)字節(jié)中的二進(jìn)位劃分為幾個(gè)不同的區(qū)域, 并說(shuō)明每個(gè)區(qū)域的位數(shù)。每個(gè)域有一個(gè)域名,允許在程序中按域名進(jìn)行操作。 這樣就可以把幾個(gè)不同的對(duì)象用一個(gè)字節(jié)的二進(jìn)制位域來(lái)表示。一、位域的定義和位域變量的說(shuō)明位域定義與結(jié)構(gòu)定義相仿,其形式為:???? 
struct 位域結(jié)構(gòu)名???? 
{ 位域列表 };??? 
其中位域列表的形式為: 類型說(shuō)明符 位域名:位域長(zhǎng)度???? 
例如:???? 
struct bs??? 
{??? 
int a:8;??? 
int b:2;??? 
int c:6;??? 
};??? 
位域變量的說(shuō)明與結(jié)構(gòu)變量說(shuō)明的方式相同。 可采用先定義后說(shuō)明,同時(shí)定義說(shuō)明或者直接說(shuō)明這三種方式。例如:???? 
struct bs??? 
{??? 
int a:8;??? 
int b:2;??? 
int c:6;??? 
}data;??? 
說(shuō)明data為bs變量,共占兩個(gè)字節(jié)。其中位域a占8位,位域b占2位,位域c占6位。對(duì)于位域的定義尚有以下幾點(diǎn)說(shuō)明:??? 
1. 一個(gè)位域必須存儲(chǔ)在同一個(gè)字節(jié)中,不能跨兩個(gè)字節(jié)。如一個(gè)字節(jié)所剩空間不夠存放另一位域時(shí),應(yīng)從下一單元起存放該位域。也可以有意使某位域從下一單元開(kāi)始。例如:???? 
struct bs??? 
{??? 
unsigned a:4??? 
unsigned :0 /*空域*/??? 
unsigned b:4 /*從下一單元開(kāi)始存放*/??? 
unsigned c:4??? 
}??? 
在這個(gè)位域定義中,a占第一字節(jié)的4位,后4位填0表示不使用,b從第二字節(jié)開(kāi)始,占用4位,c占用4位。??? 
2. 由于位域不允許跨兩個(gè)字節(jié),因此位域的長(zhǎng)度不能大于一個(gè)字節(jié)的長(zhǎng)度,也就是說(shuō)不能超過(guò)8位二進(jìn)位。???
3. 位域可以無(wú)位域名,這時(shí)它只用來(lái)作填充或調(diào)整位置。無(wú)名的位域是不能使用的。例如:???? 
struct k??? 
{??? 
int a:1??? 
int :2 /*該2位不能使用*/??? 
int b:3??? 
int c:2??? 
};??? 
從以上分析可以看出,位域在本質(zhì)上就是一種結(jié)構(gòu)類型, 不過(guò)其成員是按二進(jìn)位分配的。??? 
二、位域的使用位域的使用和結(jié)構(gòu)成員的使用相同,其一般形式為: 位域變量名•位域名 位域允許用各種格式輸出。??? 
main(){??? 
struct bs??? 
{??? 
unsigned a:1;??? 
unsigned b:3;??? 
unsigned c:4;??? 
} bit,*pbit;??? 
bit.a=1;??? 
bit.b=7;??? 
bit.c=15;??? 
pri
改錯(cuò):
#include <stdio.h>
int main(void) {
??? int **p;
??? int arr[100];
??? p = &arr;
??? return 0;
}
解答:
搞錯(cuò)了,是指針類型不同,
int **p; //二級(jí)指針
&arr; //得到的是指向第一維為100的數(shù)組的指針
#include <stdio.h>
int main(void) {
int **p, *q;
int arr[100];
q = arr;
p = &q;
return 0;
}
下面這個(gè)程序執(zhí)行后會(huì)有什么錯(cuò)誤或者效果:
?#define MAX 255
?int main()
{
?? unsigned char A[MAX],i;//i被定義為unsigned char
?? for (i=0;i<=MAX;i++)
????? A[i]=i;
}
解答:死循環(huán)加數(shù)組越界訪問(wèn)(C/C++不進(jìn)行數(shù)組越界檢查)
MAX=255 
數(shù)組A的下標(biāo)范圍為:0..MAX-1,這是其一..
其二.當(dāng)i循環(huán)到255時(shí),循環(huán)內(nèi)執(zhí)行:
? A[255]=255;
這句本身沒(méi)有問(wèn)題..但是返回for (i=0;i<=MAX;i++)語(yǔ)句時(shí),
由于unsigned char的取值范圍在(0..255),i++以后i又為0了..無(wú)限循環(huán)下去.
struct name1{
?? char? str;
?? short x;
?? int?? num;
}
struct name2{
?? char str;
?? int num;
?? short x;
}
sizeof(struct name1)=8,sizeof(struct name2)=12
在第二個(gè)結(jié)構(gòu)中,為保證num按四個(gè)字節(jié)對(duì)齊,char后必須留出3字節(jié)的空間;同時(shí)為保證整個(gè)結(jié)構(gòu)的自然對(duì)齊(這里是4字節(jié)對(duì)齊),在x后還要補(bǔ)齊2個(gè)字節(jié),這樣就是12字節(jié)。
?
4.??? static有什么用途?(請(qǐng)至少說(shuō)明兩種)
1.限制變量的作用域
2.設(shè)置變量的存儲(chǔ)域
7.??? 引用與指針有什么區(qū)別?
1) 引用必須被初始化,指針不必。
2) 引用初始化以后不能被改變,指針可以改變所指的對(duì)象。
2) 不存在指向空值的引用,但是存在指向空值的指針。
8.??? 描述實(shí)時(shí)系統(tǒng)的基本特性
在特定時(shí)間內(nèi)完成特定的任務(wù),實(shí)時(shí)性與可靠性
9.??? 全局變量和局部變量在內(nèi)存中是否有區(qū)別?如果有,是什么區(qū)別?
全局變量?jī)?chǔ)存在靜態(tài)數(shù)據(jù)庫(kù),局部變量在堆棧
10.?? 什么是平衡二叉樹(shù)?
左右子樹(shù)都是平衡二叉樹(shù) 且左右子樹(shù)的深度差值的絕對(duì)值不大于1
11.?? 堆棧溢出一般是由什么原因?qū)е碌?#xff1f;
沒(méi)有回收垃圾資源
12.?? 什么函數(shù)不能聲明為虛函數(shù)?
constructor
13.?? 冒泡排序算法的時(shí)間復(fù)雜度是什么?
O(n^2)
14.?? 寫(xiě)出float x 與“零值”比較的if語(yǔ)句。
if(x>0.000001&&x<-0.000001)
16.?? Internet采用哪種網(wǎng)絡(luò)協(xié)議?該協(xié)議的主要層次結(jié)構(gòu)?
tcp/ip 應(yīng)用層/傳輸層/網(wǎng)絡(luò)層/數(shù)據(jù)鏈路層/物理層
17.?? Internet物理地址和IP地址轉(zhuǎn)換采用什么協(xié)議?
ARP (Address Resolution Protocol)(地址解析協(xié)議)
18.?IP地址的編碼分為哪倆部分?
IP地址由兩部分組成,網(wǎng)絡(luò)號(hào)和主機(jī)號(hào)。不過(guò)是要和“子網(wǎng)掩碼”按位與上之后才能區(qū)分哪些是網(wǎng)絡(luò)位哪些是主機(jī)位。
2.用戶輸入M,N值,從1至N開(kāi)始順序循環(huán)數(shù)數(shù),每數(shù)到M輸出該數(shù)值,直至全部輸出。寫(xiě)出C程序。
循環(huán)鏈表,用取余操作做
3.不能做switch()的參數(shù)類型是:
switch的參數(shù)不能為實(shí)型。
總結(jié)
以上是生活随笔為你收集整理的c/c++面试试题(三)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: react 添加less预处理语言
 - 下一篇: jdk8 window 64位安装包 微