C語言面試題

0 用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)

 #define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL

我在這想看到幾件事情:

  1. define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)
    2)懂得預(yù)處理器將為你計算常數(shù)表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。
  2. 意識到這個表達式將使一個16位機的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。
  3. 如果你在你的表達式中用到UL(表示無符號長整型),那么你有了一個好的起點。記住,第一印象很重要。

1 如何避免頭文件被重復(fù)包含

為避免頭文件my_head.h被重復(fù)包含,可在其中使用條件編譯:

#ifndef _MY_HEAD_H

#define _MY_HEAD_H    /*空宏*/

int a;

#endif

2 static的作用

1 聲明靜態(tài)局部變量
在函數(shù)內(nèi)定義的靜態(tài)局部變量,該變量存在內(nèi)存的靜態(tài)區(qū),所以即使該函數(shù)運行結(jié)束,靜態(tài)變量的值不會被銷毀,函數(shù)下次運行時能仍用到這個值。

void test1()
{
    static int a = 1;
    a++;
}

2 聲明靜態(tài)全局變量
該變量的作用域只能在定義該變量的文件中,不能被其他文件通過extern引用。

static int a = 1;
void test2()
{
    a++;
}

3 聲明靜態(tài)外部函數(shù)
在C語言中我們的函數(shù)默認都是全局的,也就是說你可以調(diào)用其他文件中的函數(shù)。在使用的時候,我們象前面一樣在頭文件中加上extern就可以了。但是有時候我們寫的函數(shù)并不想讓別的文件訪問和調(diào)用,那么我們在聲明函數(shù)的時候前面加上static就可以了。

static void test2()
{
  printf("Hello world");    
}

3 const關(guān)鍵字的作用?

1 聲明常變量,使得指定的變量不能被修改

const int a = 5;/*a的值一直為5,不能被改變*/
const int b; b = 10;/*b的值被賦值為10后,不能被改變*/
const int *ptr; /*ptr為指向整型常量的指針,ptr的值可以修改,但不能修改其所指向的值*/
int *const ptr;/*ptr為指向整型的常量指針,ptr的值不能修改,但可以修改其所指向的值*/
const int *const ptr;/*ptr為指向整型常量的常量指針,ptr及其指向的值都不能修改*/

2修飾函數(shù)形參,使得形參在函數(shù)內(nèi)不能被修改,表示輸入?yún)?shù)

如int fun(const int a);或int fun(const char *str);

3 修飾函數(shù)返回值,使得函數(shù)的返回值不能被修改

const char *getstr(void);使用:const *str= getstr();
const int getint(void);  使用:const int a =getint();

4 extern關(guān)鍵字的作用

1 用于修飾變量或函數(shù),表明該變量或函數(shù)都是在別的文件中定義的,提示編譯器在其他文件中尋找定義。

extern int a;
extern int *p;
extern int array[];
extern void fun(void);

5 sizeof關(guān)鍵字的作用?

sizeof是在編譯階段處理,且不能被編譯為機器碼。sizeof的結(jié)果等于對象或類型所占的內(nèi)存字節(jié)數(shù)。sizeof的返回值類型為size_t。

變量:int a;  sizeof(a)為4;

指針:int *p;  sizeof(p)為4;

數(shù)組:int b[10]; sizeof(b)為數(shù)組的大小,4*10;int c[0]; sizeof(c)等于0

6 假設(shè)你只知道一個數(shù)組的數(shù)組名(a[]),如何確定這個數(shù)組的長度?

int a[10]; //a的大小是4*10
int length = sizeof(a)/sizeof(a[0]);

7 用變量a給出下面的定義

a) 一個整型數(shù)(An integer)
b)一個指向整型數(shù)的指針( A pointer to an integer)
c)一個指向指針的的指針,它指向的指針是指向一個整型數(shù)( A pointer to a pointer to an intege)r
d)一個有10個整型數(shù)的數(shù)組( An array of 10 integers)
e) 一個有10個指針的數(shù)組,該指針是指向一個整型數(shù)的。(An array of 10 pointers to integers)
f) 一個指向有10個整型數(shù)數(shù)組的指針( A pointer to an array of 10 integers)
g) 一個指向函數(shù)的指針,該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)(A pointer to a function that takes an integer as an argument and returns an integer)
h) 一個有10個指針的數(shù)組,該指針指向一個函數(shù),該函數(shù)有一個整型參數(shù)并返回一個整型數(shù)( An array of ten pointers to functions that take an integer argument and return an integer )
答案是:

a) int a; // An integer 
b) int *a; // A pointer to an integer 
c) int **a; // A pointer to a pointer to an integer 
d) int a[10]; // An array of 10 integers 
e) int *a[10]; // An array of 10 pointers to integers 
f) int (*a)[10]; // A pointer to an array of 10 integers 
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer 
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 

指針和const

指針和const.png

常常聲明的時候會讓人一頭霧水,比如下面的聲明,均是聲明一個int* p的指針:
int * const p;    // 指針不可改,也就說指針只能指向一個地址,不能更改為其他地址
int const * p;   // 所指內(nèi)容不可改,也就是說*p是常量字符串
int const * const p; // 內(nèi)容和指針都不能改
const int * const p; // 同上...內(nèi)容和指針不能改

指針和數(shù)組,函數(shù)

1 區(qū)別int (*p)[5]和int *p[5]。
 前者是一個指針,它指向一個含有5個元素的數(shù)組。后者是一個數(shù)組,它的長度為5,數(shù)組中每一個元素指向一個整型變量。

2.區(qū)別int *f( int i, int j)和 int (*p)( int i ,int j)
前者是返回指針的函數(shù),它是一個函數(shù)的聲明,后者是指向函數(shù)的指針,它定義了一個指針。
即前者是函數(shù),后者為指針。
注:不能對指向函數(shù)的指針做任何運算,如p++、p–、p+n、p-n都是錯誤的。

8 malloc/free與new/delete的區(qū)別

  1. malloc與free是C/C++語言的標(biāo)準(zhǔn)庫函數(shù),可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。
char *p1 = (char*)malloc(10);
free(p1);
  1. new/delete是C++的運算符,對于非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free無法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù),對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強加于malloc/free。因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以及一個能完成清理與釋放內(nèi)存工作的運算符delete。注意new/delete不是庫函數(shù)。
    我們不要企圖用malloc/free來完成動態(tài)對象的內(nèi)存管理,應(yīng)該用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構(gòu)造與析構(gòu)的過程,對它們而言malloc/free和new/delete是等價的。

  2. 既然new/delete的功能完全覆蓋了malloc/free,為什么C++不把malloc/free淘汰出局呢?這是因為C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。
    如果用free釋放“new創(chuàng)建的動態(tài)對象”,那么該對象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,結(jié)果也會導(dǎo)致程序出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也一樣。

參考文章

https://blog.csdn.net/lngag110/article/details/38024441
https://blog.csdn.net/lincoln_2012/article/details/49179503
https://blog.csdn.net/gaoyingju/article/details/7340446
https://www.kancloud.cn/digest/interview/164698

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • C語言中內(nèi)存分配 在任何程序設(shè)計環(huán)境及語言中,內(nèi)存管理都十分重要。在目前的計算機系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,313評論 0 2
  • 1.static關(guān)鍵字的作用? 1)第一個作用:隱藏。當(dāng)我們同時編譯多個文件時,所有未加static前綴的全局變量...
    輕皺眉頭淺憂思閱讀 997評論 1 9
  • 《2018 iOS面試題系列》 1. 用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問...
    八級大狂風(fēng)AM閱讀 11,321評論 1 46
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,628評論 30 472
  • 文/少林林默 嫁人當(dāng)嫁辛夷,比起秋水的渣,小白的軟弱,辛夷對妖刀是始終如一。 ? 辛夷,最后的畢業(yè)典禮,也是他的婚...
    尤林默閱讀 2,362評論 8 22

友情鏈接更多精彩內(nèi)容