C语言—指针 结构体 文件
目的
指针能够实现跨区域(不同作用域 不同代码块)之间的数据交互,通过指针被调用函数可以向调用函数处返回除正常的返回值之外的其他数据,从而实现两者间的双向通信。利用指针还可以实现动态内存分配。
结构体(struct):可以用来存放一组不同类型的数据。
技术
1.定义指针变量
2.为指针指向的区域赋值
3.动态分配内存
4.定义结构体及结构体变量
5.文件的打开关闭和读取写入
技术实现
- 指针
//定义一个指针变量 指向的内存空间只能存放整数
int c = 10;
int *a = &c;
注意:定义指针变量一定要给初值 不确定就给NULL
//定义指针变量
int *temp = &c;
// 访问temp地址里面的数据 赋值为21
*temp = 21;
'&' 取某个变量的地址
指针变量本身在内存空间占8个字节
定义一个数组 系统会分配内存空间 可以存值
定义一个指针变量 只为变量本身分配8个字节内存空间
无法存值 ,因为没有为它分配可以存值的内存空间
如果想给指针指向的区域赋值
1.指针变量已经指向某块区域
int a = 10;
int *pa = &a;
*pa = 30;
2.指针指向一个数组
int num[10]={};
int *pNum =num2; //指向数组num2的首地址
*(pNum+0) = 20;
pNum [0] = 20;
*(pNum +1) = 30;
pNum[1] = 30;
3.动态分配内存 malloc realloc
上面两种指向的内存都是别人的
希望分配一个属于自己的内存空间
自己分配的内存空间必须自己释放
普通变量的内存是系统自己分配 所以系统自己负责释放
char *pName = malloc(3 * sizeof(char));
//判断分配是否成功
if(pName == NULL){
//分配失败
exit(EXIT_FAILURE);
}
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
当之前分配的内存不够了 就需要在之前的基础上重新分配
realloc 必须是之前使用malloc分配过的
用完了就要自己释放
pName = realloc(pName, 4*sizeof(char));
pName[3] = 'k';
printf("%s\n", pName);
free(pName);
- 结构体 Struct
是一种数据类型 复合数据类型
struct Person{
};
struct Person {
char name[10];
char *addr;
int age;
};
- 文件的读写
//将结构体写到文件里面去
FILE *fp;
fopen_s(&fp,"C:/Users/Administrator/Desktop/abc.txt","w");
struct Student {
char name[10];
int age;
};
struct Student xw1 = {"xiaowang", 20};
fwrite(&xw1, sizeof(struct Student), 1, fp);
//关闭文件
fclose(fp);
//读取数据
FILE *fp;
fopen_s(&fp,"C:/Users/Administrator/Desktop/abc.txt","r");
struct Student {
char name[10];
int age;
};
struct Student xw1 = { "xiaowang",20 };
fread(&xw1, sizeof(struct Student), 1, fp);
printf("name:%s\n", xw1.name);
printf("age:%d\n", xw1.age);
fclose(fp);
心得
感觉今天学习的东西很多,有点难以吸收理解。而且觉得这些东西在脑中很凌乱,没办法结合形成一个该有的体系。当然,凭我现在的知识当然是没办法将这些东西整合在一起。但是让我难受的是指针这一块我还是不太理解,特别是当指针与函数、数组、结构体结合在一起的时候,我心中是崩溃的,感觉真的很凌乱,思路不清晰。不知道指针该如何指向。现在也只好尽力去理解了,或许做多了就明白了吧。