C语言第十二天知识点总结:
1.fgets函数使用的使用:
该函数是一个文件操作函数 格式为:fgets (函数名,数组长度,文件指针(stdin));
作用:从输入缓冲区中读取一个字符串保存到一个字符数组中。
fputs(数组名,stdout); fputs函数书不会自动换行的,也不能进行格式化的输出 ,而 puts函数可以自动换行。
2. const 关键字:
(1)指针变量P的指向可以改变,但是指向的变量值不可以 改变。
此时的格式为: const int *p=&a; *p=&b; *p=1000; 值不可变,此处值修改错误。
int * const=&a; *p=&b; *p=1000; 地址不可变,修改地址会出错const 修饰的地方: 1 修饰常量 2. 修饰指针变量 3. 修饰数组
3. (1)BSS段:通常是指用来存放程序中为初始化的全局变量和静态变量。
(2)数据段:通常是指用来存放程序中已初始化
(3)代码段 程序执行代码的一块内存内存区域;
(4) 堆: 进程运行中被动态分配的内存段;
(5) 栈: 用户存放程序临时创建的局部变量;
4 C语言中的内存动态分配函数:
(1)malloc函数: 格式: void *malloc(unsigned size)
从内存的堆区分配大小为size个字节的连续的内存空间,如果申请成功,返回收地址,否则,返回NULL。
memset(指针指向的空间,放入的值,设定空间的大小);主要作用是给一块空间付值。
(2)calloc函数: 格式为(块数,长度)分配内存空间
如:int *p=(int *)calloc(4,sizeof(int)); 分配了4块内存长度为4个单元的内存空间。
(3)realloc 函数可以给已经存在的空间扩充大小
格式为: P=realloc(P,40*sizeof(int ); 返回值可能是新地址,此函数有返回值。
5. 指针函数: 存放函数的首地址指针的指针变量( 返回值为指针的函数)就是指针函数。
格式为: 类型说明符 *函数名(形参表){函数体 return 函数的首地址}
6. 函数指针:我们把指向函数首地址的指针变量称为“函数指针”。
格式为: 返回值类型 (*变量名)(函数的参数);定义如下:
/* 函数指针变量
存放函数的首地址的指针变量就是函数指针变量
函数指针变量的定义
返回值类型 (*变量名)(函数的参数);
函数的声明:
int sum(int a,int b);----> 函数指针 int (*p1)(int a,int b);
//定义了一个函数指针 p1
//p1可以存放 返回值是int类型,并且有两个形参,形参的类型还都是int类型的函数的地址
//函数指针的初始化
p1 = sum; //sum存的就是函数在内存中的首地址 */
注意事项: (1)函数指针变量不能进行算数运算,这是与数组指针变量不同的,数组指针变量加减一个整数可以是指针移向指针后面,而函数指针的移动是毫无意义的。
(2)函数调用中,(*指针变量名)的两边扩考不能省略,其中的*不应该理解为求值运算,在此处他只是一种表示符号。
7. C语言的构造类型有: 1 数组类型 2.结构体类型 3. 共用体类型
结构体:格式: struct 结构名{成员列表};
结构体占用的内存空间是每个成员占用的字节数之和(要考虑对齐问题);
(注意)结构体中,局部作用域内可以屏蔽全局作用域的结构体定义。
C语言第十三天知识点总结:
1 结构数组概念:结构数组的每一个元素都是具有相同的结构类型的下标结构变量。
结构数组定义,定义格式为:
struct 结构名{ 成员列表}数组名[数组长度];
2 结构体数组的初始化 (1)定义结构体数组的同时进行初始化 (2)先定义,后初始化
3. 结构体指针变量的定义 格式: struct 结构体 *结构指针变量名
结构体指针间接访问成员值的两种方法:
(1) (*结构体指针变量).成员名 (2)结构体指针变量->成员名。
4 结构体嵌套使用 注意事项:
(1)结构体定义中,可以嵌套其它类型结构体变量,但是不可以嵌套自己类型的变量
(2) 但是可以嵌套自己结构类型的指针。 如: struct student *stud ;
5. 用结构体变量作为函数参数,实质上是直传递,不能改变主函数中的值,若想修改值, 需要用结构体指针作为函数参数。
6 枚举类型 格式: enum 枚举类型名{枚举值};
枚举类型元素的命名习惯: enum iColor{kIcolorwhite,kIcolorblack}; 枚举类型的初始化和结构体类似。此处略。
7. typedef 语法及其定义
typedef 原类型 新定义类型;
8 预处理指令及其概念: C语言提供的预处理功能,主要有:宏定义,条件包含,条件编译。
9. 宏定义中,习惯上将宏名大写,
无参宏的定义方式:#define 标示符 字符串(变量、常量、表达式)
有参宏的定义方法 #define 宏名 (参数) 字符串
10. 条件编译指令;常用的有:
(1)#if #elif #else #endif
(2) #ifndef 主要用来判断某个宏是否定义了
格式为:#ifndef 标示符
程序段1
#else 程序段2
#endif
如: #ifndef DEBUDG1
a=10;
11.条件编译指令调试bug
#include <stdio.h>
#define DEBUG1 1
#if DEBUG1 == 1
//显示调试信息
#define Log(format,...) printf(format,## __VA_ARGS__)
#else
//不显示调试信息
#define Log(format,...)
#endif
void test(){
int a = 10,b=3;
Log("test--->%d,%d\n",a,b);
}
void test1(){
printf("xxxxx\n");
float b = 10.23f;
Log("test1--->%.2f\n",b);
}
int main(int argc, const char * argv[]) {
//DEBUG1 == 1 显示调试信息
//DEBUG1 == 0 不显示调试信息
Log("xxxxxxxxxx-->\n");
test1();
test();
return 0;
}
C语言第十四天知识点总结:
一 static和extern修饰局部变量
1.static修饰局部变量,能延长变量的生命周期。
2.static定义的变量的语句只会被执行一次
3.extern不能修饰局部变量。
二 static和extern修饰全局变量
1.static修饰的全局变量只能在本文件中使用 而不能在其调用的函数中使用。
2. 在不同的文件中,使用static声明的变量可以同名。
3. extern修饰的全局变量可以在本文件中使用,也可以在其它调用的文件中使用。
4. 在不同的文件中,使用extern声明的变量不可以同名。
三 static和extern修饰函数
1.static修饰的函数,是一个内部函数,(只可以在定义的文件中使用)
2 extern声明的函数,可以在定义的文件中使用,也可以在其它文件中使用。
四 文件的概念以及分类。
1.文件的操作步骤: 引入头文件--》定义文件指针--》打开文件-文件读写--》关闭文件。
2. 字符读写函数:fgetc和fputc
字符串读写函数:fgets fputs
数据快读写函数 freed fwrite
格式化读写函数 fscanf fprinf
3. 文件指针的定义: 格式为: FILE *指针变量标识符号 一般定义为:FILE *fp;
4.文件的打开和关闭:
fopen函数,用来打开一个文件,一般形式为:
文件指针变量名= fopen(文件名,使用文件方式);
eg: FILE *fp; fp=fopen(“a.tex”“r”);
fclose(文件指针);
5. 文件的使用及注意事项:
6. 字符写入函数(fputc fgetc):
fputc: 函数的功能是把一个字符写入指定的文件中去;格式为:fputc (字符量(常量、变量、数组均可),文件指针)fgetc ( 指针文件)
例题笔记:
#include <stdio.h>
int main(int argc, const char * argv[]) {
FILE *fp = fopen("a.txt", "w");
char a,ch[10];
printf("请输入您要输入的10个字符,以#结束\n");
scanf("%s",ch);
if (fp!=NULL) {
a=getchar();
a=getchar();
while (a!='#') {
fputc(a, fp );
putchar(a);
a=getchar();
}
printf("%c",a);
fclose(fp);
putchar(10);
}
return 0;
}
EOF是文件的末尾标志;
rewind函数把文件指针指向开始位置;
7. 字符串读写函数: fputs和fgets函数:
格式 fputs(字符串,文件指针); fgets(数组名,数组长度,文件指针);
注意: (1)fgets读取的时候,当文件读去完成后 会给字符加上结束符\0
(2) fgets读取的时候,遇到\n或者EOF,读取结束。
例题笔记:
<pre name="code" class="vb">#include <stdio.h>
void test(){
//写入字符串到文件中
char str[]="welcome to afuhan";
//定义文件指针
//打开文件
FILE *fp = fopen("fputs.txt", "w");
//判断
int count=0;
if (fp!=NULL) {
//写字符串到文件中
//count 返回的事本次写入的字符串的长度
count = fputs(str, fp);
printf("写入成功,本次写入%d个字符\n",count);
}
//关闭文件指针
fclose(fp);
}
/**
* 字符串的追加
*/
void test1(){
//写入字符串到文件中
char str[]="welcome to afuhan";
//定义文件指针
//打开文件,追加是在文件的末尾追加
FILE *fp = fopen("fputs.txt", "a"); //a append
//判断
int count=0;
if (fp!=NULL) {
//写字符串到文件中
//count 返回的事本次写入的字符串的长度
count = fputs(str, fp);
printf("写入成功,本次写入%d个字符\n",count);
}
//关闭文件指针
fclose(fp);
}
int main(int argc, const char * argv[]) {
//写入字符串到文件中
char str[]="welcome to afuhan\n";
//定义文件指针
//打开文件
FILE *fp = fopen("fputs.txt", "r"); //r read
//判断
char str2[100];
if (fp!=NULL) {
//fgets(ch,10,stdin);
//从文件中读取字符到字符数组str2中
// 数组名 长度 文件指针
fgets(str2, sizeof(str2), fp);
//fputs(str, fp);
//sizeof(str2) 100
//注意:
//1)fgets读取的时候,当文件内容读取完毕后,会给字符加上结束符\0
//2)fgets读取的时候,遇到\n或者EOF,读取结束
printf("str2---->%s\n",str2);
}
//关闭文件指针
fclose(fp);
return 0;
}
8. 数据块的读写函数: fread 和fwrite 格式: fread (buttfer,size,count,fp); fwrite (buttfer,size,count,fp); 其中 buttfer是一个指针,在fread函数中,表示数据输入的缓冲区,在fwrite函数中,他表示存放输出数据的首地址。 size 表示数据快的字节数。 count 表示要输入的数据块块数。 fp 表示文件指针。例题笔记:
#include <stdio.h>
#define size 4
struct student {
char name[10];
int no;
int age;
char address[15];
}student1[size];
void test(){
printf("请输入学生四个学生的基本信息:格式为:姓名 学号 分数 地址\n");
for (int i=0; i<size; i++) {
scanf("%s%d%d%s",student1[i].name,&student1[i].no,&student1[i].age,student1[i].address);
}
FILE *fp = fopen("student1.txt", "w");
if (fp!=NULL) {
for (int i=0; i<size; i++)
fwrite(&student1, sizeof(student1), 1, fp);
printf("已写入到磁盘");
}
fclose(fp);
}
int main(int argc, const char * argv[]) {
FILE *fp = fopen("student1.txt", "r");
if (fp!=NULL) {
for (int i=0; i<size; i++)
fread(student1, sizeof(struct student), 4, fp);
}
for (int i=0; i<size; i++) {
printf("%s\t%d\t%d\t%s",student1[i].name,student1[i].no,student1[i].age,student1[i].address);
printf("\n");
}
fclose(fp);
return 0;
}
9. 格式化的读写函数: fscanf和fprintf
格式:fscanf (文件指针,格式字符串,输入表列);
fprintf (文件指针,格式字符串,输出列表);
#include <stdio.h>
void test(){
//定义文件指针,并且打开文件
FILE *fp =fopen("fprintf.txt", "w");
if (fp!=NULL) {
int a = 3,b = 4;
//格式化写入
fprintf(fp,"%d#%d;",a,b);
printf("写入成功!\n");
}
fclose(fp);
}
int main(int argc, const char * argv[]) {
//使用fprintf函数,格式化写入数据到文件中
//定义文件指针,并且打开文件
FILE *fp =fopen("fprintf.txt", "r");
if (fp!=NULL) {
int m=0,n=0; //定义连个变量
//从文件中读取数据到变量中
fscanf(fp, "%d#%d;",&m,&n);
printf("m = %d,n = %d\n",m,n);
}
fclose(fp);
return 0;
}
10. feof函数用来判断文件是否结束, feof(fp)如果文件结束,feof(fp)的值为1(真)否则为假。 例如:while(!feof(fp)){
c=fgets(fp);
}