c語言基礎面試題及答案
面試前的準備對于程序員求職者來說是非常重要的。下面小編精心整理了一些c語言基礎面試題及答案的例文,希望可以幫到你!
c語言基礎面試題及答案(一)
1、局部變量能否和全局變量重名?
答:能,局部會屏蔽全局。要用全局變量,需要使用"::"
局部變量可以與全局變量同名,在函數內引用這個變量時,會用到同名的局部變量,而不會用到全局變量。對于有些編譯器而言,在同一個函數內可以定義多個同名的局部變量,比如在兩個循環體內都定義一個同名的局部變量,而那個局部變量的作用域就在那個循環體內。
2、如何引用一個已經定義過的全局變量?
答:extern
可以用引用頭文件的方式,也可以用extern關鍵字,如果用引用頭文件方式來引用某個在頭文件中聲明的全局變理,假定你將那個變寫錯了,那么在編譯期間會報錯,如果你用extern方式引用時,假定你犯了同樣的錯誤,那么在編譯期間不會報錯,而在連接期間報錯。
3、全局變量可不可以定義在可被多個.C文件包含的頭文件中?為什么?
答:可以,在不同的C文件中以static形式來聲明同名全局變量。
可以在不同的C文件中聲明同名的全局變量,前提是其中只能有一個C文件中對此變量賦初值,此時連接不會出錯
4、語句for( ;1 ;)有什么問題?它是什么意思?
答:和while(1)相同。
5、do……while和while……do有什么區別?
答:前一個循環一遍再判斷,后一個判斷以后再循環
6、static全局變量與普通的全局變量有什么區別?static局部變量和普通局部變量有什么區別?static函數與普通函數有什么區別?
全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量。全局變量本身就是靜態存儲方式, 靜態全局變量當然也是靜態存儲方式。 這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變量的作用域是整個源程序, 當一個源程序由多個源文件組成時,非靜態的全局變量在各個源文件中都是有效的。 而靜態全局變量則限制了其作用域, 即只在定義該變量的源文件內有效, 在同一源程序的其它源文件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只能為該源文件內的函數公用, 因此可以避免在其它源文件中引起錯誤。
從以上分析可以看出, 把局部變量改變為靜態變量后是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的作用域, 限制了它的使用范圍。
static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使用的函數應該說明為內部函數(static),內部函數應該在當前源文件中說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件中說明,要使用這些函數的源文件要包含這個頭文件
static全局變量與普通的全局變量有什么區別:static全局變量只初使化一次,防止在其他文件單元中被引用;
static局部變量和普通局部變量有什么區別:static局部變量只被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什么區別:static函數在內存中只有一份,普通函數在每個被調用中維持一份拷貝.
c語言基礎面試題及答案(二)
1:變量的聲明和定義有什么區別
為變量分配地址和存儲空間的稱為定義,不分配地址的稱為聲明。一個變量可以在多個地方聲明,但是只在一個地方定義。加入extern修飾的是變量的聲明,說明此變量將在文件以外或在文件后面部分定義。
說明:很多時候一個變量,只是聲明不分配內存空間,直到具體使用時才初始化,分配內存空間,如外部變量。
2:C語言的關鍵字 static 和 C++ 的關鍵字 static 有什么區別
在C中static用來修飾局部靜態變量和外部靜態變量、函數。而C++中除了上述功能外,還用來定義類的成員變量和函數。即靜態成員和靜態成員函數。
注意:編程時static的記憶性,和全局性的特點可以讓在不同時期調用的函數進行通信,傳遞信息,而C++的靜態成員則可以在多個對象實例間進行通信,傳遞信息。
3:C中的malloc和C++中的new有什么區別
malloc和new有以下不同:
(1)new、delete 是操作符,可以重載,只能在C++中使用。
(2)malloc、free是函數,可以覆蓋,C、C++中都可以使用。
(3)new 可以調用對象的構造函數,對應的delete調用相應的析構函數。
(4)malloc僅僅分配內存,free僅僅回收內存,并不執行構造和析構函數
(5)new、delete返回的是某種數據類型指針,malloc、free返回的是void指針。
注意:malloc申請的內存空間要用free釋放,而new申請的內存空間要用delete釋放,不要混用。因為兩者實現的機理不同。
4:寫一個“標準”宏MIN
#define min(a,b)((a)<=(b)?(a):(b)) 注意:在調用時一定要注意這個宏定義的副作用,如下調用:
((++*p)<=(x)?(++*p):(x)。
p指針就自加了兩次,違背了MIN的本意。
5:一個指針可以是volatile嗎
可以,因為指針和普通變量一樣,有時也有變化程序的不可控性。常見例:子中斷服務子程序修改一個指向一個buffer的指針時,必須用volatile來修飾這個指針。
說明:指針是一種普通的變量,從訪問上沒有什么不同于其他變量的特性。其保存的數值是個整型數據,和整型變量不同的是,這個整型數據指向的是一段內存地址。
c語言基礎面試題及答案(三)
1:a和&a有什么區別
請寫出以下代碼的打印結果,主要目的是考察a和&a的區別。
#include<stdio.h>
void main( void )
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
return;
}
輸出結果:2,5。
a是數組的指針。思考,將原式的int *ptr=(int *)(&a+1);改為int *ptr=(int *)(a+1);時輸出結果將是什么呢?
2:簡述C、C++程序編譯的內存分配情況
C、C++中內存分配方式可以分為三種:
(1)從靜態存儲區域分配:
內存在程序編譯時就已經分配好,這塊內存在程序的整個運行期間都存在。速度快、不容易出錯,因為有系統會善后。例如全局變量,static變量等。
(2)在棧上分配:
在執行函數時,函數內局部變量的存儲單元都在棧上創建,函數執行結束時這些存儲單元自動被釋放。棧內存分配運算內置于處理器的指令集中,效率很高,但是分配的內存容量有限。
(3)從堆上分配:
即動態內存分配。程序在運行的時候用malloc或new申請任意大小的內存,程序員自己負責在何時用free或delete釋放內存。動態內存的生存期由程序員決定,使用非常靈活。如果在堆上分配了空間,就有責任回收它,否則運行的程序會出現內存泄漏,另外頻繁地分配和釋放不同大小的堆空間將會產生堆內碎塊。
一個C、C++程序編譯時內存分為5大存儲區:堆區、棧區、全局區、文字常量區、程序代碼區。
3:簡述strcpy、sprintf與memcpy的區別
三者主要有以下不同之處:
(1)操作對象不同,strcpy的兩個操作對象均為字符串,sprintf的操作源對象可以是多種數據類型,目的操作對象是字符串,memcpy 的兩個對象就是兩個任意可操作的內存地址,并不限于何種數據類型。
(2)執行效率不同,memcpy最高,strcpy次之,sprintf的效率最低。
(3)實現功能不同,strcpy主要實現字符串變量間的拷貝,sprintf主要實現其他數據類型格式到字符串的轉化,memcpy主要是內存塊間的拷貝。
說明:strcpy、sprintf與memcpy都可以實現拷貝的功能,但是針對的對象不同,根據實際需求,來選擇合適的函數實現拷貝功能。
4:設置地址為0x67a9的整型變量的值為0xaa66 int *ptr;
ptr = (int *)0x67a9;
*ptr = 0xaa66;
說明:這道題就是強制類型轉換的典型例子,無論在什么平臺地址長度和整型數據的長度是一樣的,即一個整型數據可以強制轉換成地址指針類型,只要有意義即可。