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