指针:
格式:类名标识符 *指针变量名 int *a = 10;
函数指针:
在c中,一个函数总是占用一段连续的内存区,而函数名是干函数所占内存去的首地址。
我们可以把函数的这个首地址赋予一个指针变量,使该指针指向该函数,然后用过指针变量就可以找到并通过这用指向函数的指针变量成为‘函数指针变量’
函数指针变量的定义的一般形式;
类型说明符 (*指针变量名)(函数的参数);
函数的声明;
Int sum(int x,int y); ----int (*p)(int x,int y);
p可以存放,返回是int类型,并且有两个形参,都是int类型的函数的地址
函数指针的初始化
P1=sum;
注意点;
1.函数指针变量不能进行算数运算,这是与数组指针变量不同的,数组指针变量加减一个整数可使指针移动的指向后面或前面的数组元素,而函数指针的移动是毫无意义的
2.函数调用中(*指针变量名)的两边的括号不可少,其中的*不应该理解为求职值运算,在次数他只是一种表示符号
指针函数:
一个函数可以返回一个值,返回值为指针的函数
一般形式:
类型名 *函数名(参数列表)
Int *a(int x,int y);
结构体指针::::
用来存放结构体变量地址的指针变量一个指针变量当用来指向一个结构体变量时,称之为结构指针变量。
结构体指针变量中的值是所指向的结构体变量的首地址;
一般形式:struct 结构名 *结构指针变量
Struct stu *pstu;
Struct Car {
int lunzi;
Int speed;
}car1;
Struct Car *p;//定义一个结构体指针变量
一般形式:
(*结构指针变量).成员名 结构指针变量->成员名
访问结构体变量的成员值:(*p).speedP->speed
结构体的嵌套的注意事项:
1)结构体定义中可以嵌套其他结构体类型的变量不可以嵌套自己这个类型的变量
2)可以嵌套自己类型的指针
初始化:
Struct stu stu1={“nig”,25,33f,{1993,12,5}};
如何访问:
Printf(“姓名;%s,年龄:%d(生日:%d-%d-%d)”,stu1.name,stu1.age,stu1.score,stu1.birthday.)year,stu1.birthday,month,stu1,birthday,day)
const 关键字:
指针变量P的指向可以改变,但是指向的变量值不可以 改变。
此时的格式为: const int *p=&a; *p=&b; *p=1000; 值不可变,此处值修改错误。
BSS段:通常是指用来存放程序中为初始化的全局变量和静态变量。
数据段:通常是指用来存放程序中已初始化
代码段 程序执行代码的一块内存内存区域;
堆: 进程运行中被动态分配的内存段;
栈: 用户存放程序临时创建的局部变量;
C语言中的内存动态分配函数:
malloc函数: 格式: void *malloc(unsigned size)
从内存的堆区分配大小为size个字节的连续的内存空间,如果申请成功,返回收地址,否则,返回NULL。
memset(指针指向的空间,放入的值,设定空间的大小);主要作用是给一块空间付值。
calloc函数: 格式为(块数,长度)分配内存空间
如:int *p=(int *)calloc(4,sizeof(int)); 分配了4块内存长度为4个单元的内存空间。
realloc 函数可以给已经存在的空间扩充大小
格式为: P=realloc(P,40*sizeof(int ); 返回值可能是新地址,此函数有返回值。
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)输入输出流
输入输出是数据传递的过程,数据如流水一样从一处流行另一处,
文件操作::
fgets函数使用的使用:
该函数是一个文件操作函数 格式为:fgets (函数名,数组长度,文件指针(stdin));
文件的概念以及分类。
文件的操作步骤: 引入头文、定义文件指针、打开文件、文件读写、关闭文件。
字符读写函数:fgetc和fputc
字符串读写函数:fgets fputs
数据快读写函数 freed fwrite
格式化读写函数 fscanf fprinf
文件指针的定义: 格式为: FILE *指针变量标识符号 一般定义为:FILE *fp;
文件的打开和关闭:
fopen函数,用来打开一个文件,一般形式为:
文件指针变量名= fopen(文件名,使用文件方式);
eg: FILE *fp; fp=fopen(“a.tex”“r”);
fclose(文件指针);
字符写入函数(fputc fgetc):
fputc: 函数的功能是把一个字符写入指定的文件中去;格式为:fputc (字符量(常量、变量、数组均可),文件指针)fgetc ( 指针文件)
字符串读写函数: fputs和fgets函数:
格式 fputs(字符串,文件指针);
fgets(数组名,数组长度,文件指针);
注意: (1)fgets读取的时候,当文件读去完成后 会给字符加上结束符\0
(2) fgets读取的时候,遇到\n或者EOF,读取结束。
<span style="font-size:18px;">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);
}
//关闭文件指针
return 0;
} </span>
<span style="font-size:18px;"><span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> 格式化的读写函数: fscanf和fprintf </span></span>
格式:fscanf (文件指针,格式字符串,输入表列);fprintf (文件指针,格式字符串,输出列表);
<span style="font-size:18px;">#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;
} </span>