0 用預(yù)處理指令#define 聲明一個常數(shù),用以表明1年中有多少秒(忽略閏年問題)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
我在這想看到幾件事情:
- define 語法的基本知識(例如:不能以分號結(jié)束,括號的使用,等等)
2)懂得預(yù)處理器將為你計算常數(shù)表達式的值,因此,直接寫出你是如何計算一年中有多少秒而不是計算出實際的值,是更清晰而沒有代價的。 - 意識到這個表達式將使一個16位機的整型數(shù)溢出-因此要用到長整型符號L,告訴編譯器這個常數(shù)是的長整型數(shù)。
- 如果你在你的表達式中用到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

常常聲明的時候會讓人一頭霧水,比如下面的聲明,均是聲明一個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ū)別
- malloc與free是C/C++語言的標(biāo)準(zhǔn)庫函數(shù),可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。
char *p1 = (char*)malloc(10);
free(p1);
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是等價的。既然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