- 相關推薦
C++經典面試問題
C++經典面試問題分享
1,關于動態(tài)申請內存
答:內存分配方式三種:
(1)從靜態(tài)存儲區(qū)域分配:內存在程序編譯的時候就已經分配好,這塊內存在程序的整個運行期間都存在,
C++經典面試問題
。全局變量,static變量。
(2)在棧上創(chuàng)建:在執(zhí)行函數(shù)時,函數(shù)內局部變量的存儲單元都可以在棧上創(chuàng)建,
函數(shù)執(zhí)行結束時這些存儲單元自動被釋放。
棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
(3)用malloc或new申請內存之后,應該立即檢查指針值是否為NULL.防止使用指針值為NULL的內存,
不要忘記為數(shù)組和動態(tài)內存賦初值。防止將未被初始化的內存作為右值使用。避免數(shù)組或指針的下標越界,
特別要當心發(fā)生“多1”或者“少1”操作。動態(tài)內存的申請與釋放必須配對,防止內存泄漏。
用free或delete釋放了內存之后,立即將指針設置為NULL,防止產生“野指針”。從堆上分配,亦稱動態(tài)內存分配。
程序在運行的時候用malloc或new申請任意多少的內存,程序員自己負責在何時用free或delete釋放內存。
動態(tài)內存的生存期由程序員決定,使用非常靈活。(int *pArray; int MyArray[6]; pArray = &MyArray[0];)
如果在申請動態(tài)內存時找不到足夠大的內存塊,malloc和new將返回NULL指針,
判斷指針是否為NULL,如果是則馬上用return語句終止本函數(shù),
或者馬上用exit(1)終止整個程序的運行,為new和malloc設置異常處理函數(shù)。
2,C++指針攻破
答案:指針是一個變量,專門存放內存地址,特點是能訪問所指向的內存
指針本身占據(jù)了4個字節(jié)的長度
int **ptr; //指針的類型是 int **
int (*ptr)[3]; //指針的類型是 int(*)[3]
int *(*ptr)[4]; //指針的類型是 int *(*)[4]
ptr++:指針ptr的值加上了sizeof(int)
ptr+=5:將指針ptr的值加上5*sizeof(int)
指針的賦值:
把一個變量的地址賦予指向相同數(shù)據(jù)類型的指針變量( int a; int *ip; ip=&a; )
把一個指針變量的值賦予指向相同類型變量的另一個指針變量(int a; int *pa=&a; int *pb; pb=pa; )
把數(shù)組的首地址賦予指向數(shù)組的指針變量(int a[5],*pa; pa=a; 也可寫為:pa=&a[0];)
如果給指針加1或減1 ,實際上是加上或減去指針所指向的數(shù)據(jù)類型大小。
當給指針加上一個整數(shù)值或減去一個整數(shù)值時,表達式返回一個新地址。
相同類型的兩個指針可以相減,減后返回的整數(shù)代表兩個地址間該類型的實例個數(shù)。
int ** cc=new (int*)[10]; 聲明一個10個元素的數(shù)組,數(shù)組每個元素都是一個int *指針,
每個元素還可以單獨申請空間,因為cc的類型是int*型的指針,所以你要在堆里申請的話就要用int *來申請;
int ** a= new int * [2]; //申請兩個int * 型的空間
a[0] = new int[4]; ////為a的第一個元素申請了4個int 型空間,a[0] 指向了此空間的首地址處
a[1] = new int[3]; //為a的第二個元素又申請了3個int 型空間,a[1]指向了此空間首地址處
指針數(shù)組初始化賦值:
一維指針開辟空間:char *str;int *arr; scanf("%d",&N);
str=(char*)malloc(sizeof(char)*N);
arr=(int*)malloc(sizeof(int)*N);
二維指針開辟空間:int **arr, i; scanf("%d%d",&row,&col);
arr=(int**)malloc(sizeof(int)*row);
for(i=0;i
arr[i]=(int*)malloc(sizeof(int)*col);
結構體指針數(shù)組,例如typedef struct{ char x; int y; }Quan,*QQuan;
定義一個結構體指針數(shù)組如:QQuan a[MAX]
for(i=0;i
{
a[i]=(QQuan)malloc(sizeof(Quan));
memset(a[i],0,sizeof(Quan));
}
指針數(shù)組賦值
float a[]={100,200,300,400,500};
float *p[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
char *units[1000];
char get_unit[250];
for(int i=0;i
scanf("%s", get_unit); strcpy(units[i],get_unit);}
3,復雜指針解析:
(1)int (*func)(int *p);
(*func)()是一個函數(shù),func是一個指向這類函數(shù)的指針,就是一個函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值類型是 int,
資料共享平臺
《C++經典面試問題》(http://salifelink.com)。(2)int (*func)(int *p, int (*f)(int*));
func是一個指向函數(shù)的指針,這類函數(shù)具有int *和int (*)(int*)這樣的形參。形參int (*f)(int*),f也是一個函數(shù)指針
(3)int (*func[5])(int *p);
func數(shù)組的元素是函數(shù)類型的指針,它所指向的函數(shù)具有int*類型的形參,返回值類型為int。
(4)int (*(*func)[5])(int *p);
func是一個指向數(shù)組的指針,這個數(shù)組的元素是函數(shù)指針,這些指針指向具有int*形參,返回值為int類型的函數(shù)。
(5)int (*(*func)(int *p))[5];
func是一個函數(shù)指針,這類函數(shù)具有int*類型的形參,返回值是指向數(shù)組的指針,所指向的數(shù)組的元素是具有5個int元素的數(shù)組。
注意:
需要聲明一個復雜指針時,如果把整個聲明寫成上面所示的形式,對程序可讀性是一大損害。
應該用typedef來對聲明逐層,分解,增強可讀性,例如對于聲明:int (*(*func)(int *p))[5];
這樣分解:typedef int (*PARA)[5]; typedef PARA (*func)(int *);
例如:int (*(*func)[5][6])[7][8];
func是一個指向數(shù)組的指針,這類數(shù)組的元素是一個具有5X6個int元素的二維數(shù)組,而這個二維數(shù)組的元素又是一個二維數(shù)組。
typedef int (*PARA)[7][8];
typedef PARA (*func)[5][6];
例如:int (*(*(*func)(int *))[5])(int *);
func是一個函數(shù)指針,這類函數(shù)的返回值是一個指向數(shù)組的指針,
所指向數(shù)組的元素也是函數(shù)指針,指向的函數(shù)具有int*形參,返回值為int。
typedef int (*PARA1)(int*);
typedef PARA1 (*PARA2)[5];
typedef PARA2 (*func)(int*);
4,函數(shù)指針詳解
答:函數(shù)指針是指向一個函數(shù)入口的指針
一個函數(shù)指針只能指向一種類型的函數(shù),即具有相同的返回值和相同的參數(shù)的函數(shù)。
函數(shù)指針數(shù)組定義:void(*fun[3])(void*); 相應指向類A的成員函數(shù)的指針:void (A::*pmf)(char *, const char *);
指向外部函數(shù)的指針:void (*pf)(char *, const char *); void strcpy(char * dest, const char * source); pf=strcpy;
【C++經典面試問題】相關文章:
C++面試筆試題目07-16
幼師面試技巧面試問題及基本問題05-21
面試問題:英文面試中常見問題大全08-06
幼師面試技巧面試問題10-21
面試常問的問題10-15
面試應注意的問題09-30
面試:情景性問題08-04
FACEBOOK面試問題09-01
美國面試問題10-12
家教面試問題08-17