c程序的組成
由一個或多個.c和.h文件組成
*.c :c源代碼文件
*.h :c頭文件
.c(c源代碼文件)組成
(1)預處理命令 :以'#'開頭的行
(1)文件包含命令:#include 把后面的那個文件的內容在此處展開
#include <stdio.h>
or
#include "stdio.h"
兩種都是文件包含的命令形式,都是把后面的那個文件的內容在此處展開
區別:
<> 和 “” 區別僅僅只在於文件搜索的默認路徑不一樣
<> :會在標准的頭文件路徑下去一個一個搜索 /usr/include
"" :會在當前工程下去找,如果沒找到,在到標准的頭文件路徑下去搜索
(2)宏定義命令
僅僅只是“替換”作用
(1)在一些程序中經常要用到可能需要頻繁修改的常量
(2)給一些有意義的常量
#define 宏名 要替換的常量或表達式
#define LED_ON 1
而typedef的話是相當於新聲明了一個類型。
例如:typedef struct node{int data, struct node *next};
這是單鏈表的典型定義,假如你需要在后面main函數或者其他函數使用的話,你可以使用struct node *p = malloc(sizeof(struct node))或者node *p = malloc(sizeof(*p))
別人博客上是如此解釋的:
typedef是類型定義的意思。typedef struct 是為了使用這個結構體方便。
具體區別在於:
若struct node {}這樣來定義結構體的話。在申請node 的變量時,需要這樣寫,struct node n;
若用typedef,可以這樣寫,typedef struct node{}NODE; 。在申請變量時就可以這樣寫,NODE n;
區別就在於使用時,是否可以省去struct這個關鍵字。
練習:
寫一個宏,返回兩個對象的最大值
#define MAX(a,b) (a)>(b)?(a):(b)
=> MAX(3+5,6+7)
XXX(a,b) (a)/(b)
eg:XXX(2+3,4+5)
2+3/4+5
int a = 5;
MAX(a++,4);
(a++) > (4) ? (a++) : (4)
#define MAX(a,b) ({
typeof(a) _a = a;
typeof(b) _b = b;
(_a)>(_b)?(_a):(_b) ;
}
)
(3)條件編譯:選擇那些代碼編譯,哪些不編譯
int main()
{
....
printf();
....
printf();
}
(1) #if 1/0
YYYYY
#else //可不要
XXXXX
#endif
=====
#define W 1
#if W
YYYYY
#else //可不要
XXXXX
#endif
====
#define W 1
#ifdef W
XXXXX
#else
YYYYY
#endif
(2)全局聲明語句
“聲明”:c語言中聲明,聲明一個名稱就是把一個標識符與某個C語言對象相關
c語言對象:變量,函數,數組,類型
=》變量聲明
函數聲明
數組聲明
類型聲明
(3)代碼部分
C語言中的代碼是以“函數”形式組織的。
C語言中的指令必須要在函數內部
c函數有兩部分組成
函數頭
函數體
C語言函數體主要有兩部分組成:
局部聲明
c語句(指令)組成
C語句:
1.控制語句:完成一定的控制功能
if/else
for/while/do_while
continue
break
switch
goto
return
2.函數調用語句
printf("fgeui");
3.表達式語句
由一個表達式+一個;構成的一個語句
a = 4;
4.空語句
;
5.復合語句 :用一對{}括起來的語句
{
}
.h文件組成
一般由
預處理命令
聲明部分
組成
#ifndef _SUM_H_
#define _SUM_H_
#endif
=>防止頭文件被重復包含
c程序設計結構
1.順序
2.選擇
3.循環
指針常量:指向常量的指針
不可以改變指向變量的內容,但是可以改變指向某個變量
const int*p;
int const *p;
常量指針:不可以改變他指向哪個變量,但是改變已經指向的某變量的內容
int * const p = &a;//必須要初始化,指向常量,不能改變
const
extern
static
char s[] = {'1','2'};
END