C语言简述
一 、C简单入门
1.1、C语言特点
-
使用方便,功能强大(面向过程)
C 语言书写形式自由、结构严整
C 语言含有丰富的操作、数据类型及关键字(32 个,const, static, int)
C 语言允许用户自定义数据类型(struct , union, …) -
便于结构化编程
C 语言引入函数作为程序的基本模块,从面使得结构化设计及层次化设计变得十分简单
C 语言有多种简单但相当灵活的控制语句 -
C 语言是中级语言
C 语言的位运算功能使得 C 程序可以直接访问物理内存,对硬件实现操作,从而实现了
汇编语言大部分功能。同时,它还具有高级语言程序可读性强、便于结构化设计的功能 -
执行效率高
C语言贴近低级语言,所生成的代码质量高;同时,还能对底层进行位操作,大大提高运行效率。 -
可移植性好
1.2、第一个C程序
//1. 是否有库函数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
//2. 自定义函数入口
int main(void)
{
printf(“hello, world!\n”);
return 0;
}
◇开头一般都有一些以#include 开头的预处理语句,它的作用是用来包含一些外部文
件。
◇均有一个 main 函数,它是程序的执行入口
◇程序的执行主体都放在 main 函数的函数体中
◇变量必须在定义后才能使用
◇可以使用一系列的操作符对变量进行操作
◇可以调用别的函数来实现一些功能
◇需要使用 return 来返回 0
◇程序执行过程是从 main 函数开始,到它的 return 语句结束
◇要有适当的注释语句,以辅助说明语句功能
◇在不同程序段要适当地加空行,使程序结构更清晰
◇程序语句要有良好的缩进风格,以提高代码可读性
1.3、C语言编译
环境:
◇ ubuntu 下安装及使用 vim
◇ ubuntu 下安装及使用 gcc
编译过程
-
预处理阶段
#gcc test.c -E -o test.i
作用:
◇ 将#include 的内容解释出来
◇ 处理条件预处理命令,比如#if #ifdef #elif #else #endif 等
◇ 删除所有的注释 /* … */ //
◇ 展开宏定义 -
编译阶段
#gcc test.i -S -o test.S
作用:
◇检查语法错误
◇翻译成汇编语言 -
汇编阶段
#gcc test.S -c -o test.o
作用:
◇将汇编语言生成机器指令 -
链接阶段
#gcc test.o -o test.elf
作用:
◇将机器码链接成段
◇添加各种地址信息到headinfo段中
1.4、代码执行
ubuntu终端
#./test
本质:
1、加载处理
2、跳到真正的代码入口执行
二 、C语言基础
2.1、常量与变量
-
常量
常量是指在程序运行过程中不可改变的量,C语言中的数值都可以用常量来表示。常量可以表示各种数据类型的值。
实例:- 456
- -129LL
- 056
- ‘\037’
- 3e2
- 83.23
- ‘e’
分析: - 456 的值为整数 456
- -129LL 的值为负整数-129,类型为 long long int 型
- 056 表示一个八进制整数,类型为 int 型
- ‘\037’表示一个 ASCII 码字符,类型为 char 型
- 3e2 的 3 的 2 次方,类型为 double 型
- 83.23 的值为浮点数 83.23,类型为 double 型
- ‘e’表示一个字符’e’,类型为 char 型
-
变量
变量,是指可以改变的量,三部分组成:
数据类型 变量名 = 变量值
如:
int a = 88; a = 99;
char c = 12;
long long int k= 1110;
变量类型是内存描述符, 用于反映内存块的属性, 变量名一个标识符,变量值是一个数据值。
程序为每个变量分配一个存储空间,其数据存储在这个空间内。程序通过变量名来访问这个空间,也可以通过变量值来修改这个空间存储的内容。
示例:变量的访问与修改
#include <stdio.h>
int main(void)
{
int data = 24; /* 定义变量 data */
printf(“data = %d\n”, data + 1); /* 访问变量 data */
data = 26;
printf(“data = %d\n”, data); /* 修改变量 data */
return 0; /* 再次访问变量 data */
}
- 如果定义了全局变量或者静态变量,但是并没有初始化,则在编译时链接到 bss 段,但并没有分配空间
- 如果定义了全局变量或者静态变量,而且初始化,则在编译时链接到 data 段,占用空间
- 如果是局部变量,则是在代码运行期间动态分配内存空间。
使用 extern 声明变量
一般情况下,变量需要先定义后才能使用,否则会报错。若一定要在变量定义之前使用变量,则需要使用 extern 关键字声明变量。
2.2、基本数据类型
数据类型:数据在内存中存在方式/操作方式
int data = 1;
定义数据类型:
1)告知编译器,内存操作的具体封装形式
2)主要是用于告诉处理器,要操作的内存空间的操作属性
.读写大小(以类型确定的大小为最小操作单位)
.起始地址
如:char a = 100;
int *p = 0xe0200280
2.2.1、类型分布
有符号整形
char(1)
short(2)
int(2/4)
long(4) 64 位系统 8 个字节
long long(8)
无符号整形
unsigned(char short int long)
浮点型
float(4)
double(8)
布尔型
bool(1)
存储中的几种码制:原码、反码、补码
- 正数的原码=反码=补码
- 对于负数
原码 = 100xxxxx
反码 = 原码除了符号位外,其他位取反
补码 = 反码 + 1 (最高符号位也是不变的)
说明:
◇ 浮点型是非常占用空间的,所以在具体的开发过程中,能不用小数就不要用小数
◇ 能用单精度时不要用双精度(以省内存,加快运算速度)。
◇ 如果想让代码具有更好的移植性, 建议用 double 来定义浮点数
◇ unsigned char xx 用于定义整型数据
◇ char xx 用于定义字符或者字符串空间
◇void 的字面意思是“无类型”,void*类型是“无类型指针”,void *可以指向任何类型的数据。如果函数没有返回值,应声明为void 类型。如果函数无参数,应声明其参数为void 类型
2.2.2、类型转换
C 语言的类型转换,可以分为两种
- 自动类型转换(隐式类型转换,有编译器完成)
主要应用在以下几种情景:
◇ 赋值运算,自动把“=”右边的表达式的类型转换成“=”右边的变量的类型
示例: int a=4.5; a 的值实际是 4! - 强制类型转换(手动完成)。
安全数据类型转换 低数据类型可以转化为高类型 :char ->short->int->long
char ch = 100;
short sh = 10;
sh = ch; //sh = (short)ch; (short)强制类型转化
不安全数据类型转换
char ch = 100;
int i = 250;
ch = i; //ch = (char)i; (char)强制类型转化
结果 ch != 250; 原因超出它的存储范围