今日任务
知道gcc的用法,学习了C语言的数据类型,数组,字符串,函数。
今日任务完成情况
用冒泡排序以及冒泡排序的改进进行排序;了解两种不借助第三个变量,交换两个变量思想方法。
今日问题
vim下复制粘贴不行;递归求1的阶乘到n的阶乘之和不会。
今日开发收获
gcc
用法:gcc 选项 参数
默认可执行程序名字是a.out
选项: -o 文件名 指定可执行程序名字
-Wall 显示所有警告错误
-I 文件路径; 指定包含的头文件路径
-L 文件路径; 指定使用的库文件路径
-l库文件名; 指定引用的库
-g 选项为生成调试信息,若要使用GDB进行程序调试,编译时必须带-g选项。
举例:
gcc -o test.i -E test.c
gcc -o test.s -S test.i
gcc -o test.o -c test.s
gcc -o main test.o
以上四部可以直接写成一步:gcc -Wall -o main test.c
假如一个程序由main.c fun1.c fun2.c
gcc -c main.c 生成main.o 目标文件
gcc -c fun1.c 生成fun1.o 目标文件
gcc -c fun2.c 生成fun2.o 目标文件
gcc -o main main.o fun1.o fun2.o
一步生成
gcc -Wall -o main -g main.c fun1.c fun2.c
系统默认头文件路径/usr/include/
系统默认库文件路径/usr/lib
libm.so 动态库
libm.a 静态库
举例: gcc -o hello hello.c -Wall -static -lm
make工程管理器
makefile文件的编写/作用
GDB调试程序
C语言数据类型
基本数据类型:整型、浮点型、字符型、枚举、指针
空类型:void
复合数据类型:数组、结构体、联合体
假定是32位系统
整形:int
short \ long \long long \signed \unsigned
默认都是signed
signed int 32
unsigned int 32
signed short int 16
unsigned short int 16
signed long int 32
unsigned long int 32
验证:sizeof 运算符
浮点数:
float 32
double 64
字符型
char
枚举
enum
指针
数据类型 *
void 类型待定
为什么要用补码?
CPU只支持加法和移位运算,补码可以解决减法运算问题
补码解决减法运算问题原理:
不需要判断操作数的绝对值大小,直接进行补码加法
(3-5)补码 = 3 补码+(-5)补码
(5-3)补码 = 5补码 + (-3)补码
补码定义(字长8位为例,最高位是符号位,0表示正,1表示负):
正数:原码=补码
举例:127(十进制) 转换为二进制111 1111 补码就是0111 1111
1(十进制) 转换为二进制000 0001 补码就是0000 0001
负数:原码!=补码 -128当特例记住
举例:-1(十进制) 求该数的绝对值的二进制的值 转换为二进制000 0001 原码就是1000 0001
-127(十进制) 求该数的绝对值的二进制的值 转换为二进制111 1111 原码就是1111 1111
-128(十进制) 求该数的绝对值的二进制的值 转换为二进制1000 0000 原码就是1000 0000
怎样求补码?把原码符号位除外取反加一
举例:-1 原码是1000 0001 符号位除外取反加一后 1111 1111
-127 原码是1111 1111 符号位除外取反加一后 1000 0001
-128 原码是1000 0000 符号位除外取反加一后 1000 0000
补码运算后怎样得到真值:符号位除外取反加一
A补码+B补码=C补码
举例:假如C补码=1000 0000 首先,符号位为1,是负数,真值等于符号位除外取反加一,1000 0000 十进制就是128,所以C补码的真值就是-128
所有有符号整形数据类:正最大值再加一就变成了负的最小值 举例:signed char a=127;
所有无符号整形数据类:正最大值再加一就变成了零 举例:unsigned char b=255;
大端模式/小端模式
小端模式:低位在低字节,高位在高字节
小端模式:高位在低字节,低位在高字节
举例:short int a = 127
低地址 高地址
小端模式 0111 1111 0000 0000
小端模式 0000 0000 0111 1111
数组详解
一维数组的定义
格式:类型说明符 数组名[常量表达式];例: int a[10]
功能:定义一个一维数组,常量表达式的值,就是数组元素的个数。
注意:常量表达式中可以包括常量(100)和符号常量(#define MAX 100),不能包含变量,即数组元素个数不可变
错误用法:
const int MAX=100;
int a[MAX];
数组不能直接访问,访问的是数组元素,数组元素的引用形式为: 数组名 [下标]
注意:第一个元素下标是0
...
int a[N] a[0]......a[N-1]
for(i=0;i<N;i++) a[i]=i;
使用数组时一定注意下标越界问题,编译程序不会检查数组访问越界问题。
数组必须先定义,后使用。C 语言规定只能逐个引用数组元素,不能一次引用整个数组。
一维数组的初始化
int a[10]={10,11,12,13,14,15,16,17,18,19};
int a[10]={0,0,0,0,0,0,0,0,0,0}; 或int a[10]={0};
int a[10]={1};部分初始化,没赋值的全部置0
int a[ ]={11,12,13,14,15};
int a[10] ={11,12,13,14,15}; 部分初始化,没赋值的全部置0;
二维数组的定义
格式: 类型说明符 数组名[常量表达式1][常量表达式2]
二维数组的引用
二维数组也必须先定义,后引用。 二维数组元素的引用形式为:数组名[行下标] [列下标]
二维数组的初始化
int a[3][4]={{1,2,3,4},{5,6, 7,8},{9,10,11,12}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int a[ ][4]={{0,0,1},{0},{0,6}};
int a[3][4]={{1},{5},{9}}; 部分初始化,没赋值的全部置0;
字符数组
字符数组的定义、初始化及引用同前面介绍的一维数组、二维数组类似,只是类型说明符为char,对字符数组初始化或赋值时,数据使用字符常量或相应的ASCII码值。
【注意】以字符串常量的形式对字符数组初始化时,系统会自动地在该字符串的最后加入字符串结束标志‘\0’,因此数组长度是实际字符数加1
char a[6]={'h','e','l','l','o','\0'};
char a[6]="hello";
字符串连接函数strcat strcat (字符数组名1,字符数组名2)
字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2)
字符串比较函数strcmp strcmp(字符数组名1,字符数组名2)
测字符串长度函数strlen strlen(字符数组名)
自我评价
不断总结,不断提高,扎扎实实,稳扎稳打。