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