C++学习之内存管理、复合类型、文件
一.内存管理
1.作用域(上)
2.作用域(下)
3.内存四区
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
全局变量 数据区 初始化会放在data
//int g_a = 10;
//int g_b = 20;
//
全局常量
//const int g_c_a = 10;
//const int g_c_b = 20;
//
//int main()
//{
// //局部变量 栈区
// int a = 10;
// int b = 20;
//
// //打印地址
// printf("%u\n", &a);
// printf("%u\n", &b);
//
// printf("%u\n", &g_a);
// printf("%u\n", &g_b);
//
// static int s_a; //未初始化 放在 bss
// static int s_b;
// printf("%u\n", &s_a);
// printf("%u\n", &s_b);
//
// //数据区 中的常量区
// printf("%u\n", &"hello world");
// printf("%u\n", &"hello world1");
//
// //局部常量 栈
// const int c_a = 10;
// const int c_b = 20;
// printf("%u\n", &c_a);
// printf("%u\n", &c_b);
//
//
// //全局常量 数据区 常量区
// printf("%u\n", &g_c_a);
// printf("%u\n", &g_c_b);
//
// //堆区
// char * ch = malloc(64);
// printf("堆区: %u\n", ch);
//
// system("pause");
// return EXIT_SUCCESS;
//}
4.memset
5.10内存管理_04mencpy
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
//void test01()
//{
// //memcpy 可以拷贝数组
// int arr1[5] = { 0 };
// int arr2[5] = { 1,2,3,4,5 };
//
// memcpy(arr1, arr2, sizeof(arr2));
//
// for (int i = 0; i < 5; i++)
// {
// printf("%d\n", arr1[i]);
// }
//}
//
//void printString(char* arr, int num)
//{
// for (int i = 0; i < num; i++)
// {
// printf("%c", arr[i]);
// }
// printf("#\n");
//}
//
//void test02()
//{
// char str1[64] = { 0 };
// char str2[64] = "hello\0world";
// strcpy(str1, str2);
// printString(str1,sizeof(str1));
//
// memset(str1, 0, sizeof(str1));
// memcpy(str1, str2, sizeof(str2));
// printString(str1, sizeof(str1));
//}
//
//int main()
//{
// test02();
//
//
// system("pause");
// return EXIT_SUCCESS;
//}
6.10内存管理_05_menmmove
7.10内存管理_06_mamcmp
8.10内存管理_07_malloc
9.10内存管理_08_malloc案例_动态数组
10.10内存管理_09_内存操作易错点
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//1、返回局部变量的地址
int* func()
{
int a = 10;
return &a;
}
void test01()
{
int* p = func();
printf("*p = %d\n", *p); //由于vs保护了数据,所以返回的第一次的时候可以成功接受
printf("*p = %d\n", *p);
}
//可以返回静态局部变量的地址
int* func2()
{
static int a = 10;
return &a;
}
void test02()
{
int* p = func2();
printf("*p = %d\n", *p);
printf("*p = %d\n", *p);
printf("*p = %d\n", *p);
printf("*p = %d\n", *p);
printf("*p = %d\n", *p);
}
//2、不要操作释放的空间
void test03()
{
int * p = malloc(sizeof(int));
*p = 1000;
printf("*p = %d\n", *p);
free(p);
printf("*p = %d\n", *p); //p指向的内存已经被释放了,再次访问属于非法行为
}
//3、不要重复释放同一段内存
void test04()
{
int* p = malloc(sizeof(int));
*p = 1000;
printf("*p = %d\n", *p);
//free(p);
//p = NULL;
//free(p); //error 堆区内存重复释放,是错误的,解决方式,释放过后将指针置空
if (p != NULL)
{
free(p);
p = NULL;
}
if (p != NULL)
{
free(p);
p = NULL;
}
}
//4、同级指针修饰内存失败
void allocateMemory(int* p1)
{
p1 = malloc(sizeof(int));
}
//解决方式1 :利用函数返回值
int * allocateMemory2()
{
int * p1 = malloc(sizeof(int));
return p1;
}
//解决方式2 :利用高级指针修饰低级指针
void allocateMemory3(int** p1)
{
*p1 = malloc(sizeof(int));
}
void test05()
{
int* p = NULL;
//allocateMemory(p); //同级指针修饰失败
//p = allocateMemory2(); //解决方式1 成功
allocateMemory3(&p); //解决方式2 成功
*p = 100;
printf("*p = %d\n", *p);
free(p);
}
int main()
{
test05();
system("pause");
return EXIT_SUCCESS;
}
二.复核类型
1.复核类型_01_结构体定义和创建
//#define _CRT_SECURE_NO_WARNINGS
//#include<stdio.h>
//#include<string.h>
//#include<stdlib.h>
//
结构体的定义和创建
定义语法:struct 结构体名 { 成员列表 };
举例:定义学生结构体
//struct student
//{
// //int id = 1; //学号 定义结构体成员时候不可以给初始值
// int id; //学号
// char name[64]; //姓名
// int age; //年龄
//}s3, s4 = {2,"Jerry",20};
//
//int main()
//{
//
// //结构体变量的创建
// //语法:struct 结构体名称 变量名
// struct student s1;
// struct student s2 = { 1,"Tom",18 };
//
// system("pause");
// return EXIT_SUCCESS;
//}
2.复核类型_02_结构体成员访问和赋值
3.复核类型_03_结构体数组
4.复核类型_04_结构体数组排序
5.复核类型_05_结构体嵌套结构体
6.复核类型_06_结构体指针
7.复核类型_07_结构体与堆栈
8.复核类型_08_结构体做函数参数
9.复核类型_09_结构体案例_结构体嵌套一级指针
10.复核类型_10_const修饰结构体指针
11.复核类型_11_联合体
12.复核类型_12_枚举
三.文件
1.文件的基本概念
2.文件指针
3.文件打开和关闭
4.字符方式读写文件
5.字符读写文件案例
6.文本文件和二进制文件区别
7.行方式读写文件
8.行读写文件案例(上)
9.行读写文件案例(下)
10.格式化读写文件
11.格式化读写文件案例
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//写文件 随机数.txt
void test01()
{
srand((unsigned int)time(NULL));
FILE* fp = fopen("随机数.txt", "w");
if (fp == NULL)
{
printf("文件打开失败\n");
return;
}
for (int i = 0; i < 100; i++)
{
//1到1000的随机数
fprintf(fp, "%d\n", rand() % 1000 + 1);
}
fclose(fp);
printf("随机数生成完毕\n");
}
void bubbleSort(int arr[], int n)
{
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
//读取文件 随机数.txt 排序 写入到 有序数.txt 中
void test02()
{
int arr[100] = { 0 };
FILE* fp = fopen("随机数.txt", "r");
if (fp == NULL)
{
printf("文件打开失败\n");
return;
}
for (int i = 0; i < 100; i++)
{
fscanf(fp, "%d\n", &arr[i]);
}
fclose(fp);
//排序 升序
bubbleSort(arr, 100);
//测试
//for (int i = 0; i < 100; i++)
//{
// printf("%d\n", arr[i]);
//}
//写入到文件 有序数.txt
fp = fopen("有序数.txt", "w");
if (fp == NULL)
{
printf("文件打开失败\n");
return;
}
for (int i = 0; i < 100; i++)
{
fprintf(fp, "%d\n", arr[i]);
}
fclose(fp);
}
int main()
{
//test01();
test02();
system("pause");
return EXIT_SUCCESS;
}