结构体可以用来生成新的数据类型 结构体所生成的新的数据类型中
可以包含多个不同的部分 每个部分可以使用不同的数据类型表示
结构体仅仅是一种数据类型不在内存中占据存储位置,它仅仅描述了多个数据之间的关系
使用结构体声明变量叫做结构体变量 他们才是真正占据存储位置
声明关键字struct 通常放在头文件中 声明语句不会分配位置 所以不能呢过初始化
可以使用如下语句声明结构体 struct personp;
其中struct 是关键字 person是结构体名称 p是结构体变量名
在C语言中函数是不可以写到结构体声明中的
typedef关键字给结构体起别名
结构体初始化跟数组一样(区别是结构体初始化数据可以类型不同)
同类的结构体可以直接赋值
结构体变量可以作为形参也可以作为实参使用 但是尽量不这么做
根据结构体指针表示内部变量:
任何变量的地址一定是他自身大小的倍数这叫数据对齐 数据对齐会造成内存浪费
整个结构体大小必须是内部占地最大变量的整数倍这叫数据补齐
对齐补齐实例:
2 typedef struct
3 {
4 char buf[2];
5 int num;
6 char a;
7 }node;
sizeof(node)=12;
枚举类型可以把一组相关名称统一转换成整数 需要enum关键字
联合也是一种数据类型 也可以用来表示多组不同数据之间的关系
联合中不同部分数据存在是重叠的
联合使用union关键字
对联合任何一组数据修改都会影响到其他组
可以在程序运行过程中临时创建变量这种创建变量的方式叫做动态分配
动态分配的变量都存放在堆中
为了使用这些函数需要包含stdlib.h头文件
malloc函数可以动态分配多个连续的字符类型存储位置(以字节为单位)。
这个函数会把分配好的第一个字节的地址记录在返回值变量中。以后通过这个地址
使用分配好的存储位置,这些存储位置可以任意使用。malloc失败会把空地址返回。
动态分配的存储空间在不再使用的适合必须释放 否则会内存泄露
void *malloc(size_t size);
free函数 释放动态分配的内存空间
void free(void *ptr);
calloc同样可以分配内存 并且可以保证分配好的存储位置都清零
void *calloc(size_t nmemb, size_t size);
realloc调整一段已经分配好的内存空间的大小
void *realloc(void *ptr, size_t size);
函数指针用来记录函数的地址 函数名称可以代表函数的地址 函数指针声明是从函数声明变化而来的
函数指针可以作为形参使用这样可以实现毁掉函数的效果
atoi把字符串里的整数转换成整数数据
int atoi(const char *nptr);
atof把字符串里的带小数点数字转换成double类型
sprintf可以把数据一次打印到字符串中
int sprintf(char *str, const char *format, ...);
sscanf函数从字符串中按照格式读出数据并记录到变量中
int sscanf(const char *str, const char *format, ...);
fprintf/fscanf是文件版的输入输出函数
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
输入输出缓冲区:
程序为了提高效率在输入输出函数中会设定一个缓冲区 数据先仿如缓冲区
在必要时才输入输出
以下四种情况输出缓冲区会写到屏幕上
1)\n
2 #include<stdio.h>
3 int main()
4 {
5 printf("hello");
6 while(1);
7 return 0;
8 }
此种情况不会出现hello,
5 printf("hello\n");
这种情况可以出现hello
2)函数结束的情况下(就是正常情况主函数结束)
3)输出缓冲区被充满了
1 //输出缓冲区
2 #include<stdio.h>
3 int main()
4 {
5 while(1)
6 {
7 printf("hello");
8 }
9 return 0;
10 }
4)使用fflush(stdout);//stdout标准输出通常代表显示器
2 #include<stdio.h>
3 int main()
4 {
5 printf("hello");
6 fflush(stdout);
7 while(1)
8 return 0;
9 }
sleep可以让进程休眠一段时间 unistd.h
sqrt 求平方 fabs 绝对值 pow可以算一个数字的幂
编译时需要使用-lm选项 需要头文件math.h
1 #include<stdio.h>
2 #include<math.h>
3 int main()
4 {
5 printf("%0.0f\n",sqrt(36));//开方
6 printf("%0.0f\n",fabs(-9));//绝对值
7 printf("%0.0f\n",pow(2,3));//次幂
8 return 0;
9 }
arr是一个数组名称 &arr是对数组名称取地址 这两个一样
函数名字和对函数取地址的结果一样的
可以包含多个不同的部分 每个部分可以使用不同的数据类型表示
结构体仅仅是一种数据类型不在内存中占据存储位置,它仅仅描述了多个数据之间的关系
使用结构体声明变量叫做结构体变量 他们才是真正占据存储位置
声明关键字struct 通常放在头文件中 声明语句不会分配位置 所以不能呢过初始化
可以使用如下语句声明结构体 struct personp;
其中struct 是关键字 person是结构体名称 p是结构体变量名
在C语言中函数是不可以写到结构体声明中的
typedef关键字给结构体起别名
结构体初始化跟数组一样(区别是结构体初始化数据可以类型不同)
同类的结构体可以直接赋值
结构体变量可以作为形参也可以作为实参使用 但是尽量不这么做
根据结构体指针表示内部变量:
任何变量的地址一定是他自身大小的倍数这叫数据对齐 数据对齐会造成内存浪费
整个结构体大小必须是内部占地最大变量的整数倍这叫数据补齐
对齐补齐实例:
2 typedef struct
3 {
4 char buf[2];
5 int num;
6 char a;
7 }node;
sizeof(node)=12;
枚举类型可以把一组相关名称统一转换成整数 需要enum关键字
联合也是一种数据类型 也可以用来表示多组不同数据之间的关系
联合中不同部分数据存在是重叠的
联合使用union关键字
对联合任何一组数据修改都会影响到其他组
可以在程序运行过程中临时创建变量这种创建变量的方式叫做动态分配
动态分配的变量都存放在堆中
为了使用这些函数需要包含stdlib.h头文件
malloc函数可以动态分配多个连续的字符类型存储位置(以字节为单位)。
这个函数会把分配好的第一个字节的地址记录在返回值变量中。以后通过这个地址
使用分配好的存储位置,这些存储位置可以任意使用。malloc失败会把空地址返回。
动态分配的存储空间在不再使用的适合必须释放 否则会内存泄露
void *malloc(size_t size);
free函数 释放动态分配的内存空间
void free(void *ptr);
calloc同样可以分配内存 并且可以保证分配好的存储位置都清零
void *calloc(size_t nmemb, size_t size);
realloc调整一段已经分配好的内存空间的大小
void *realloc(void *ptr, size_t size);
函数指针用来记录函数的地址 函数名称可以代表函数的地址 函数指针声明是从函数声明变化而来的
函数指针可以作为形参使用这样可以实现毁掉函数的效果
atoi把字符串里的整数转换成整数数据
int atoi(const char *nptr);
atof把字符串里的带小数点数字转换成double类型
sprintf可以把数据一次打印到字符串中
int sprintf(char *str, const char *format, ...);
sscanf函数从字符串中按照格式读出数据并记录到变量中
int sscanf(const char *str, const char *format, ...);
fprintf/fscanf是文件版的输入输出函数
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
输入输出缓冲区:
程序为了提高效率在输入输出函数中会设定一个缓冲区 数据先仿如缓冲区
在必要时才输入输出
以下四种情况输出缓冲区会写到屏幕上
1)\n
2 #include<stdio.h>
3 int main()
4 {
5 printf("hello");
6 while(1);
7 return 0;
8 }
此种情况不会出现hello,
5 printf("hello\n");
这种情况可以出现hello
2)函数结束的情况下(就是正常情况主函数结束)
3)输出缓冲区被充满了
1 //输出缓冲区
2 #include<stdio.h>
3 int main()
4 {
5 while(1)
6 {
7 printf("hello");
8 }
9 return 0;
10 }
4)使用fflush(stdout);//stdout标准输出通常代表显示器
2 #include<stdio.h>
3 int main()
4 {
5 printf("hello");
6 fflush(stdout);
7 while(1)
8 return 0;
9 }
sleep可以让进程休眠一段时间 unistd.h
sqrt 求平方 fabs 绝对值 pow可以算一个数字的幂
编译时需要使用-lm选项 需要头文件math.h
1 #include<stdio.h>
2 #include<math.h>
3 int main()
4 {
5 printf("%0.0f\n",sqrt(36));//开方
6 printf("%0.0f\n",fabs(-9));//绝对值
7 printf("%0.0f\n",pow(2,3));//次幂
8 return 0;
9 }
arr是一个数组名称 &arr是对数组名称取地址 这两个一样
函数名字和对函数取地址的结果一样的