目录
一、gcc编译器
1、第一个c程序
二、Eclipse CDT
1、安装何启动
三、c语言基础
1、C语言概述
2、数据类型
一、gcc编译器
Linux
系统下的标准
C
编译器。名字取自 “
GNU C Compiler”
。
C
语言编程流程
1、第一个c程序
代码
编译 & 运行
编译选项
-E
仅进行预处理,不进行其他操作。助于发现宏错误。
-S
编译到汇编语言,不进行其他操作。
-c
编译、汇编到目标代码,不进行链接
-Wall
尽可能多地显示警告信息。
-
Werror
将所有的警告当作错误处理。
-g
在可执行文件中包含标准调试信息。
-I
设置头文件的路径,可以设置多个,默认路径
“
/
usr
/include
”
。
-L
设置库文件的路径,可以设置多个,默认路径
“
/
usr
/lib
”
。
-l
设定编译所需的库名称,如果一个库的文件名为“
libxxx.so”
那么 它的库名称为“
xxx”
。
选项 | 含义 |
--help | 显示命令帮助说明 |
--version | 显示编译器版本信息 |
-o <文件> | 指定输出文件名,缺省设置为“a.out”。 |
-D MACRO | 定义宏MACRO。 |
-E | 仅进行预处理,不进行其他操作。 |
-S | 编译到汇编语言,不进行其他操作。 |
-c | 编译、汇编到目标代码,不进行链接 |
-g | 在可执行文件中包含标准调试信息。 |
-Wall | 尽可能多地显示警告信息。 |
-Werror | 将所有的警告当作错误处理。 |
-w | 禁止所有警告。 |
-ansi | 采用标准的ANSI C进行编译。 |
-l library | 设定编译所需的库名称,如果一个库的文件名为“libxxx.so”那么它的库名称为“xxx”。 |
-I path | 设置头文件的路径,可以设置多个,默认路径“/usr/include”。 |
-L path | 设置库文件的路径,可以设置多个,默认路径“/usr/lib”。 |
-static | 使用静态链接,编译后可执行程序不依赖于库文件。 |
-O N | 优化编译,主要提高可执行程序得运行速度,N可取值为1、2、3。 |
-Q | 显示各个阶段的执行时间。 |
二、Eclipse CDT
1、安装何启动
在
Unbutu12.04
环境下的安装方法
初次启动时会要求用户设置工作空间(
workspace
)的位置。
工作空间是
Eclipse
中软件项目的所有文件所存放的目录,工作空间同时也是
Eclipse
进行资源管理的一个环境
。
主界面包含4个窗格。
创建项目并运行
File -> New -> Project…
项目设置
给项目添加源程序文件。
File -> New -> Source File
源代码编辑器中编写代码
Build
在终端上运行
程序调试
基本调试方法
断点
单步
查看变量
调用栈
查看内存
查看寄存器
反汇编
显示行号
Window -> Preferences
General ->
编辑hw.c
运行
设置断点
调试
单步(f6)
继续运行(f8)
三、c语言基础
1、C语言概述
既可以编写系统软件,也可以编写应用软件。
Dennis M Ritchie
为开发
UNIX
操作系统的方便而设计出来的。
大多数操作系统的内核的大部分内容都是用
C
语言编写的。
优点
语言简洁、紧凑、灵活(
32
个关键字,
9
种控制语句)。
运算符丰富(
34
种),表达式类型多样、灵活、简练。
数据结构丰富、合理,能够方便地实现链表、树、栈、队列和图等各种复杂的结构。
具有结构化的控制语句,符合现代编程风格。
兼有高级语言和低级语言的特点。
可移植性好。
目标代码质量高
,
程序执行效率高。
语法限制不太严格
,
程序设计自由度大。
2、数据类型
“
数据结构
+
算法
=
程序
”
(
Niklaus Wirth
)
数据类型决定了数据可参与的运算、所表示的数的范围和所占用的内存大小。
数据类型所占用的内存大小因平台而异(以
32
位
Linux
为例)。
常量与变量
在程序运行过程中,其值不可改变的量称为常量;反之,其值可以改变的量称为量。
常量可分为直接常量和符号常量。
直接常量从其字面形式即可判别
,
如
2
、
1.23456
、
’
A
’
等。
符号常量用一个标识符来代表一个固定不变的量,其优点是使得的程序的可读性更好。
符号常量定义:
#define
常量名 常量值
¡
例:
#define PI 3.1415926
变量定义:
数据类型 变量名
int a; /*
定义整型变量
a */
float b; /*
定义浮点型变量
b */
变量应“先定义,后使用”。
整型
可细分为基本型(
int
)、短整型(
short
)、长整型(
long
)和无符号型。
基本型占
4
个字节、短整型占
2
个字节、长整型占
8
个字节
;
它们各有对应的无符号型:
unsigned int
、
unsigned short
和
unsigned long
。
无符号型数据的最高位不用作符号位。
整型常量
三种表示形式
十进制整数。由数字
0~9
和正负号表示,如:
123
,
-456
,
0
。
八进制整数。由数字
0
开头,后跟数字
0~7
表示,如:
0123
,
011
。
十六进制整数。由
0x
或
0X
开头,后跟
0~9
,
a~f
,
A~F
表示,如:
0x123,0Xff
。
整型常量默认为
int
型。若其值所在范围确定超出了
int
的表示范围,则其类型为
long
型。如:
123
是
int
型,
0x123456789
是
long
型。
也可以在整常量后加上字母
l
或
L
,指明它是
long
型,如:
1234L
。
整型变量
定义:
整型数据类型 变量名
整型数据为类型可以为:int
、
long
、
short
。并且可以在这三个关键字前加上关键字
signed
和
unsigned
指明是有符号还是无符号。默认为有符号整型。
例:
int x, y; /*定义
x, y
为整型变量*
/
unsigned short m, n; /*定义
m, n
为无符号短整型变量*
/
long a; /*定义
a
为长整型变量*
/
浮点型
可分为单精度浮点型(
float
)和双精度浮点型(
double
)。单精度浮点型占
4
个字节和双精度浮点型占
8
个字节。
浮点型常量
两种表示形式
十进制整数。由整数部分、小数点和小数部分组成,如:
1.24
、
0.345
、
.222
、
234.0
、
333.
、
0.0
等。
指数形式。形如
<
实数部分
>e<
指数部分
>
,如:
1.23E2
、
314.15E-2
、
0E3
等。
E
之后的整数表示的是
10
的几次方。
浮点型常量默认为
double
型,可以在浮点型常量后加上字母
f
或
F
,指明它是
float
型,如:
1.234F
。
浮点型变量
定义:
double
变量名
或
float
变量名
例:
double x, y; /*
定义
x, y
为双精度浮点型变量*
/
float m, n; /*
定义
m, n
为单精度浮点型变量*
/
字符型
可分为
char
和
unsigned char
两种,均占
1
个字节。字符型数据可视为一个整数。
字符型常量
用单引号括起来的单个普通字符或转义字符。普通字符如
:
’
A
’
、
’
a
’
、
’
8
’
等,转义字符以反斜线
(
’
\
’
)
后面跟一个字符或一个代码值表示。
转义字符 | 含义 | 转义字符 | 含义 |
\n | 换行 | \t | 水平制表符 |
\v | 垂直制表符 | \b | 退格 |
\r | 回车 | \f | 走纸换页 |
\a | 响铃 | \\ | 反斜线 |
\’ | 单引号 | \” | 双引号 |
\ddd | 3位8进制数ddd代表的字符 | \xhh | 2位16进制数hh代表的字符 |
字符串常量
用双引号括起来的字符序列,如:
”
abcd
”
。
序列末尾隐含了一个空字符
’
\0
’
(
ASCII
值为
0
)。故,字符串
”
a
”
实际包含了两个字符
’
a
’
和
’
\0
’
,占用两个字节。
字符型变量
定义:
char
变量名
例:
char d; /*
定义
d
为字符型变量*
/
程序示例
布尔型
布尔型只有
“
真
”
和
“
假
”
两个值,
C
语言使用整数
1
表示
“
真
”
,使用整数
0
表示
“
假
”
。
在进行逻辑判断时,
C
语言将任何非零值都认为是
“
真
”
,而将零值认为是
“
假
”
。
例:
printf
("%d\n", 3 > 2); /*
结果为
1 */
printf
("%d\n", 3 > 2 > 1); /*
结果为
0 */
printf
("%d\n", 3 && 2); /*
结果为
1 */
printf
("%d\n", 3 && 0); /*
结果为
0 */
枚举型
枚举类型变量的取值范围只限于所列举出来的值。
使用
enum
关键字定义
:
例:
enum
week {sun,
mon
,
tue
, wed,
thu
,
fri
, sat};
说明
花括号中以逗号分隔的标识符称为枚举元素,枚举元素也称枚举常量,具有固定的整数值。
右花括号后的
“
;
”
是必不可少的语法组成部分。
默认情况下,第一个枚举元素的值为
0
,其它枚举元素的值是其前一个元素的值加
1
后得到的值。
也可以在枚举元素后用
“
=
”
为其指定一个值,例如:
enum
week {
mon
=1,
tue
, wed,
thu
,
fri
, sat, sun=0};
定义枚举变量
如:
enum
week weekday;
使用枚举变量
如:
weekday = wed;
数组
由
n
(
n ≥ 1
)个具有相同数据类型的数据元素
a
0
、
a
1
、
…
、
a
n-1
构成的一个有序序列(集合)。
标记数组元素的下标个数决定了数组的维数。
数组的所有元素存储在一块地址连续的内存单元中,最低地址对应首元素,最高地址对应末元素。
一维数组
定义:
数据类型 数组名
[
整型常量表达式
];
如:
int a[5];
初始化:用一对花括号括起以逗号分隔的元素。
如:
int a[5] = {0, 1, 2, 3, 4};
如果花括号中值的个数少于数组的长度(部分初始化),则后面无对应值的元素的初值为一个随机数,但如果是静态数组,则后面无对应值的元素的初值为
0
。
如:
static int a[5] = {0, 1, 2};
一维数组
引用:只能逐个引用数组元素,而不能一次引用数组的所有元素。
二维数组
定义:
数据类型 数组名
[
整型常量表达式
] [
整型常量表达式
];
如:
int a[2][3];
初始化:
使用两层花括号括起以逗号分隔的元素,内层的每对花括号对应一行。如:
int a[2][3] = {{0, 1}, {2, 3}, {4, 5}};
也可以只用一对花括号为二维数组赋初值,按元素的排列顺序(行序优先)依次为各元素赋初值。
二维数组也可以部分初始化。如:
int a[2][3] = {0, 1, 2, 3};
引用
只能逐个引用二维数组的各个元素
字符数组
定义:
char 数组名[整型常量表达式]
;
如:
char str[5];
初始化:
逐个初始化
,如:
char str[5] = {'H', 'e', 'l', 'l', 'o'};
用字符串常量为字符数组初始化,如:
char str[6] = "Hello";
引用
可以逐个引用字符数组的各个元素,也可以以字符串的形式一次引用字符数组的所有元素。
指针
一个变量在内存中的地址就称为该变量的
“
指针
”
。
一级指针
指针变量的定义
指针变量是用来存放另一个变量的
“
地址
”
的变量,当一个指针变量
p
所存放的内容是另一个变量
a
的地址时,称变量
p
“
指向
”
变量
a
。
定义:
数据类型 *指针变量名
;
如:
int *p;
指针变量的赋值
建议总是将指针变量初始化为空值
——
NULL
对指针变量进行赋值只有三种情况是合法的。一是赋
NULL
值,二是赋同类型变量的地址,三是赋同类型指针。
一级指针
指针变量的引用
使用
“
*
”
操作符(定义指针时用的
“
*
”
不是指针引用,而是指针变量的说明符)
。
引用指针变量所指向的目标的内容。
引用指针变量之前应当确保它指向了一个有效的地址单元。
二级指针
二级指针变量的定义
指针变量是用来存放另一个变量的
“
地址
”
的变量,当一个指针变量
p
所存放的内容是另一个变量
a
的地址时,称变量
p
“
指向
”
变量
a
。
定义:
数据类型 **指针变量名
;
如:
int **pp;
二级指针变量的赋值
也只有三种情况是合法的。一是赋
NULL
值,二是赋同类型的一级指针变量的地址,三是赋同类型指针。
二级指针变量的引用
连续用两个
“
*
”
操作符。
结构体
结构体是多数据项的一种组织方式,是由多个数据项构成的紧密关联的数据单元。
结构体类型所占内存的大小是其所有成员所占内存大小之和。
结构体类型的定义
示例
结构体类型变量的定义
在定义好一个结构体类型之后,即可定义该结构体类型的变量。
格式:
struct
结构体名 变量名
;
¡
如:
struct student a;
结构体成员的引用
只能逐个引用结构体的数据成员,而不能一次引用结构体的所有成员。
使用分量运算符
——“
.
”
结构体成员的初始化
在定义结构体变量的同时用花括号进行初始化。
如:
struct student a = {1, {'T', 'o', 'm', '\0'}};
共用体
几个不同的数据成员存放在同一段内存的结构。
共用体类型的定义方式、共用体变量的定义方式以及共用体成员的引用方式和结构体相类似,区别在于使用
“
union
”
关键字代替了
“
struct
”
关键字。
当各成员类型所占用的内存大小不同时,共用体所占的内存大小是其最大成员所占内存的大小。
示例
自定义类型
使用typedef关键字为已存在的类型取一个别名,即自定义一个类型名
。
自定义类型的用法和功能与已有类型的用法和功能完全一样。
语法格式:
typedef
已有数据类型 新类型名
;
如:
常用于为书写较为复杂的类型
(
如结构体、共用体
)
取一个别名。
如: