数组:一次记录大量信息的方式
特点:
1,所有的变量类型一致
2,数组是有顺序的,数组元素有已知的顺序
3,数组名为编号为0的元素的地址
数组的初始化:
按照顺序进行初始化,如果只初始化部分元素,后边初始化为0;若无初始化,则为随机数
注意:c语言不对数组进行边界检查
数组指针是指针变量可以被赋值,arr是一个地址不可以被赋值
数组作为函数参数时,传递的是0元素的地址,而不是整个数组
二维数组:一维数组的数组
maxtrix[i] -> *(maxtrix+1) maxtrix[1][2] --> *(*(matrix+1)+2)
数组指针:
int (*ptr)[3]; //大小为3的一维数组的指针变量
int maxtrix[2][3]; ptr = maxtrix;
指针数组:int *ptr[3]; //大小是3的一维数组,元素都为int * 的指针变量
字符串:在c语言中,是将字符串作为字符数组来处理,用字符数组来存放字符串
字符数组的长度:字符数组包含元素的个数
字符串的长度:字符串中非零字符的个数 字符数组长度不等于字符串长度
在c语言中,规定一个字符串的结束符号为‘\0’
字符数组的两种输入方式:
1,逐个字符串输入:printf("%c",c[i]); scanf("%c",c[i]);get(c)
2,整个字符串一次输入:printf("%s",c); scanf("%s",c);空格结束,gets(c);
编译预处理:
hello.c 预处理 hello.igcc -E hello.c -o hello.i
hello.i 编译 hello.sgcc -S hello.i -o hello.s
hello.s 汇编 hello.ogcc -C hello.s -o hello.o
hello.o 链接hello gcc hello.o -o hello
宏 #define 标识符 语言符号字符串
在预处理的时候,用后边的字符串代替前面的标识符
注意:字符串常量里的标识符不会被替换
宏定义的字符串,尽量多的添加小括号
#ifndef _文件名_H 1,调试程序的时候使用,用于添加或注释log信息
#define _文件名_H 2,防止文件重复包含
#endif
<> 优先从系统路径/usr/include/下查找头文件
""优先从当前路径下,也就是源文件所在路径下查找,如果找不到,再到系统路径/usr/include/下查找头文件
分文件
.h文件:头文件,对应源文件的函数声明,外部变量声明,宏定义,结构体类型声明,枚举类型声明
.c文件:源文件,函数的定义,变量的定义,函数的调用,变量声明
标准输入 stdin 有缓存 缓存的刷新/清空
标准输出 stdout有缓存 1,缓存区满 2,遇到\n
标准错误 stderr无缓存 3,遇到fflush 4,程序运行结束
结构体
类型不同的一些数据放到一起,可以吧不同类型的数据进行封装
结构体内部的数据,叫做成员
结构体可以使用{}进行初始化,类似于数组的初始化
对结构体不可以整体进行操作,只能对最终成员进行操作
结构体可以进行嵌套
结构体指针:
访问成员时,用->进行访问,或者(*ptr).age
结构体数组:
数组中每个元素都是一个结构体,访问的时候先访问元素再指定到具体成员
struct s_t leader[3];leader[0].name
函数传参:
参数是结构体类型,传参就是把结构体变量内容复制一份(通常不传结构体),用结构体变量的地址,指针为参数,传递地址,比较节省时间。
int main(int argc ,char *argv[])
argc:参数的个数,包含可执行文件的那个字符串
argv:每个字符串组成的向量
数组的特点:1,类型一致 2,空间顺序连续
共用体/联合体
union 类型名{成员;};
不同类型的变量占用同一段内存空间,这样的类型叫共用体。在同一时段,只能使用一个成员变量
位断:
struct packed_data 在一个结构体中,一位bit为单位来指定某个成员所占内存的长度,这种以位为单位的成员称为位段或位域
{
unsigned int a:2;
unsigned int b:6;
int i;
}
共用体和位段的应用:读取一个int型数据的一字节:
struct p_data { char a; char b; char c; char d; }; union { int i; struct p_data data; }