c语言编程基本概念,读朱兆祺攻破C语言之一----编程基本概念
下面文章來(lái)自朱兆祺編寫的《攻破c語(yǔ)言筆試和機(jī)試難點(diǎn)》的pdf,加上部分自己驗(yàn)證程序。在此感謝這位牛人為我們?cè)敱M講解了C語(yǔ)言細(xì)節(jié)和難點(diǎn)問(wèn)題。
1、#include《 》和include“ ”區(qū)別?
#include《》用來(lái)包含開發(fā)環(huán)境提供的庫(kù)文件,而#include“ ”用來(lái)包含.c、.cpp文件所在目錄下頭文件。注:#include“”包含的路徑大于#include《》,一般建議使用#include" "包含頭文件。
2、switch(c)中c的類型
c支持類型整型或者可以轉(zhuǎn)換整型的數(shù)據(jù)(int,long),而浮點(diǎn)型(float、double)是不支持。
3、const用途
1、防止一個(gè)變量值被改變,可以使用const關(guān)鍵字。定義該const變量時(shí),通常對(duì)其賦值初始化,因?yàn)橐院蟛辉试S再去改變它。
2、對(duì)于指針來(lái)說(shuō),可以指定指針本身為const,也可以指定指針?biāo)傅臄?shù)據(jù)為const或二者同時(shí)指定為const。
3、在一個(gè)函數(shù)聲明中,const可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值。
4、對(duì)于類的成員函數(shù),若指定其為const類型,則表明是常數(shù)函數(shù),不能修改類成員變量
5、對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為const類型,以使其返回值不為“左值”。?個(gè)人不明白
4、#ifndef? 、#define、#endif
頭文件中的#ifndef? 、#define、#endif的作用?作用:
1、在uboot、linux內(nèi)核文件中經(jīng)常看到,這些條件預(yù)編譯多用于對(duì)代碼的編譯控制,增加代碼的可裁剪性,通過(guò)宏定義可以輕松對(duì)代碼進(jìn)行裁剪。
2、防止頭文件被重復(fù)定義?。實(shí)例說(shuō)明:
#ifndef __UART_H_
#define __UART_H_
/*函數(shù)說(shuō)明*/
#endif //__UART_H_
5、全局變量和局部變量
全局變量和局部變量在內(nèi)存中的是否有區(qū)別?
區(qū)別:初始化的全局變量存放在DATA段,未初始化的全局變量存放在BSS段,而局部變量存放在堆棧中。提示:局部變量太大可能導(dǎo)致棧溢出,所以建議較大的數(shù)據(jù)定義全局變量(存放在mian函數(shù)外)。
6、函數(shù)調(diào)用中形參和實(shí)參
函數(shù)的參數(shù)分為形參和實(shí)參兩種。
1、形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開該函數(shù)則不能使用。
2、實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
形參:在定義函數(shù)時(shí),函數(shù)名后面括號(hào)中變量名稱。
實(shí)參:在主調(diào)用函數(shù)調(diào)用一個(gè)函數(shù)時(shí),函數(shù)名后面括號(hào)中的參數(shù)(可以是表達(dá)式、變量、數(shù)值等)。
下面實(shí)例說(shuō)明一下:
/* 比較大小 */
int max(int x , int y)
{
int z;
z=x>y?x:y;
return (z);
}
/*主函數(shù)*/
void main(void)
{
int a,b,c;
scanf("%d,%d",&a,&b);
c=max(a,b);
printf("%d\n",c);
}
其中mian函數(shù)中a、b是實(shí)參,而max()函數(shù)中x、y是形參。函數(shù)調(diào)用過(guò)程中:a值傳遞給x,b值傳遞給y。
函數(shù)的形參和實(shí)參具有以下特點(diǎn):
1.形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí),即刻釋放所分配的內(nèi)存單元。因此,形參只有在函數(shù)內(nèi)部有效。函數(shù)調(diào)用結(jié)束返回主調(diào)函數(shù)后則不能再使用該形參變量。
2.實(shí)參可以是常量、變量、表達(dá)式、函數(shù)等,無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須具有確定的值,以便把這些值傳送給形參。因此應(yīng)預(yù)先用賦值,輸入等辦法使實(shí)參獲得確定值。
3.實(shí)參和形參在數(shù)量上,類型上,順序上應(yīng)嚴(yán)格一致,否則會(huì)發(fā)生類型不匹配”的錯(cuò)誤,并且形參和實(shí)參的類型應(yīng)該相同或者兼容,如果是不同的類型應(yīng)該按照不同類型數(shù)值的規(guī)則進(jìn)行轉(zhuǎn)換,例如實(shí)參是3.5,但是形參是整數(shù),應(yīng)該按照轉(zhuǎn)換規(guī)則將3.5轉(zhuǎn)換成整形3賦值給形參
4.函數(shù)調(diào)用中發(fā)生的數(shù)據(jù)傳送是單向的。即只能把實(shí)參的值傳送給形參,而不能把形參的值反向地傳送給實(shí)參,實(shí)參和形參在內(nèi)存中分別占用不同的內(nèi)存單元。因此在函數(shù)調(diào)用過(guò)程中,形參的值發(fā)生改變,而實(shí)參中的值不會(huì)變化。除非是實(shí)參和形參是地址傳遞(數(shù)組、指針)。
7、大小端存儲(chǔ)
計(jì)算機(jī)的 數(shù)據(jù)存儲(chǔ)方式由大端存儲(chǔ)和小端存儲(chǔ)兩種。
1、小端模式:內(nèi)存的低地址存數(shù)據(jù)的低位,內(nèi)存的高地址存數(shù)據(jù)的高位。即低低高高。
2、大端模式:內(nèi)存的低地址存放數(shù)據(jù)的高位,內(nèi)存的高地址存數(shù)據(jù)的低位。即第高高低。
下面驗(yàn)證pc機(jī)的存儲(chǔ)模式(在pc機(jī)運(yùn)行c-free)
#include
int main(void)
{
int a = 0x12345678;
char *p = (char *)(&a);
if (*p == 0x78)
{
printf("xiao duan!\n");
printf("sizeof(a) = %#x\n",sizeof(a));
/*輸出數(shù)據(jù)存儲(chǔ)的詳情*/
printf("p = %#x,*p = %#x\n",p,*p);
printf("p+1 = %#x,*(p+1) = %#x\n",p+1,*(p+1));
printf("p+2 = %#x,*(p+2) = %#x\n",p+2,*(p+2));
printf("p+3 = %#x,*(p+3) = %#x\n",p+3,*(p+3));
}
else if (*p == 0x12)
{
printf("da duan!\n");
printf("sizeof(p) = %#x\n",sizeof(p));
/*輸出數(shù)據(jù)存儲(chǔ)的詳情*/
printf("p = %#x,*p = %#x\n",p,*p);
printf("p+1 = %#x,*(p+1) = %#x\n",p+1,*(p+1));
printf("p+2 = %#x,*(p+2) = %#x\n",p+2,*(p+2));
printf("p+3 = %#x,*(p+3) = %#x\n",p+3,*(p+3));
}
else
{
printf("other!\n");
}
return 0;
}
運(yùn)行結(jié)果
由運(yùn)行結(jié)果可知:
如果是大端存儲(chǔ)模式,正好相反。低地址0x22FF74存儲(chǔ)數(shù)據(jù)高位0x12,高地址0x22FF77存儲(chǔ)數(shù)據(jù)低位0x78。
8、用typedef命令已有類型
typedef是C/C++的一個(gè)關(guān)鍵字,可以用來(lái)給數(shù)據(jù)類型或函數(shù)類型定義一個(gè)別名,在編程中應(yīng)用十分的廣泛,本文詳細(xì)介紹一下這個(gè)關(guān)鍵字。
(在此過(guò)程中,typedef并未創(chuàng)造新的類型,只是對(duì)已有的類型重新命名而已)。
1.?typedef作用于數(shù)據(jù)類型
用法:typedef?type-declaration?synonym;
這樣我們就可以直接用synonym來(lái)聲明變量,和用type-declaration效果是一樣的。不僅可以簡(jiǎn)化比較復(fù)雜的類型聲明,還可以定義一些有意義的類型別名,增加程序的可讀性。微軟在這一塊做的特別好。
例1:
tyepdef? int???? INTEGER
tyepdef? float?? REAL
定義: int? i;float a?? 等同?? INTEGER?? i; REAL? a;
例2:typedef? struct
{
int? month;
int? day;
int year;
}DATE
聲明新類型DATE,它代表上面指定的結(jié)構(gòu)體類型。(如果沒(méi)有typedef ,則DATE是結(jié)構(gòu)體型的變量)。這時(shí)使用DATE定義變量:? DATE birthday;
DATE? *p;
例3:
1.1?可以用一個(gè)已經(jīng)被定義的別名來(lái)定義另一個(gè)別名。例如:
1.2?一個(gè)別名可以被重復(fù)定義多次,但必須保證每次的類型都相同。例如:
1.3?typedef定義的別名僅僅在它的作用域內(nèi)起作用。例如:
2.?typedef?作用于函數(shù)
可以用typedef來(lái)定義函數(shù)的別名。一般有兩種用法,一種是定義函數(shù)名,另一種是定義函數(shù)指針。
1.1?定義函數(shù)名的別名。例如:
1.2?定義函數(shù)指針的別名。例如:
總結(jié)
以上是生活随笔為你收集整理的c语言编程基本概念,读朱兆祺攻破C语言之一----编程基本概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: c语言八大数据基本类型,C语言中基本的数
- 下一篇: c语言最小元素下标怎么看,查找最小的k个
