【C语言学习】指针|动态内存分配|结构体|文件的用法

心得感悟

今天的内容较多,可能因为没有让我们运用知识点完整地写完一个程序,感觉掌握还不够透彻。而且因为软件问题,visual stdio总是出错,好在旁边的同学能帮忙解答。C语言的课堂学习已经结束了,但是课后学习还在继续,在理解好以下内容后,可以写一个学生信息管理系统,相信彼时我的能力能有大幅度提高。


1. 目的

  • 掌握指针的定义和使用
  • 梳理指针和数组的关系
  • 掌握动态内存的分配
  • 掌握结构体的使用
  • 学会新建,打开,读取,写入,关闭文件

2. 技术

  • 指针定义及用法
  • 指针与数组的内存分配问题
  • 动态内存分配定义及用法
  • 结构体的定义及用法
  • 文件的用法

3. 技术的使用

  • 指针定义及用法
  • 【定义】

我们为什么要用指针呢?
首先,从定义理解,指针指向地址,为数据分配内存,可以解决跨区域(不同作用域 不同代码块)之间的数据交互。

当我们声明或定义指针时,规定指针为什么类型,则它只能用来存放该类型的数据或数组,举个例子:

   int *a = 20;//不能运行,指针变量只能存地址 不能存具体值
   float b = 20;
   int *a = &b;//不能运行,b不是整型
   int c = 10;
   int *a = &c;//正确

  • 【用法】

除了定义指针变量之外,指针都是访问某个地址的值
int *temp = &c;//定义指针变量
*temp = 21; 访问temp地址里面的数据 赋值为21

'&'表示取某个变量的地址
,举点例子来解释指针所占的内存:

   int a = 10;
   int *pa= &a;

   int a2[10] = {};
   int *pa2= a2;//可指向数组
   
   int test (int a){return 0;}
   int(*pFunc)(int) = test;

   printf("lu\n",sizeof(a));//a为整型,占4个字节
   printf("lu\n",sizeof(*pa));//pa是指针,占8个字节
   printf("lu\n",sizeof(a2));//a2为整型数组,占40个字节(4*10)
   printf("lu\n",sizeof(*pa2))://p2为指针,占8个字节
   printf("lu\n",sizeof(*pFunc));//pFunc为指针,占8个字节

\color{#ea4335}{但是由于window系统位数和各个软件的编译器差异,输出的结果可能并不是上数,在此学习到此类思想就可以了}

  • 指针和数组的关系

数组名并不是一个变量 没有分配内存空间,再看如下例子:

   int score[5]={39,32,87,58,27};

   //score + 1 =0x100 +1 * 4 = 0x104
   printf("%p\n",score);//指向首地址0x100
   printf("%p\n",score + 1 );//指向下一个地址,整型占4个字节,故下一个地址为0x104
   printf("%d\n",*(score + 1));//32第二个地址存放的值
   printf("%d\n",*score + 1);//40先调出首地址的值39再+1

   printf("%d\n",(*score)++);//39先调出首地址的值,执行完这条语句后,再+1
   printf("%d\n",score[0]);//40上个语句执行完毕后,首地址的值即为39+1
   printf("%d\n",++*score);//41先对首地址是指+1再执行语句,即40+1
  • 动态内存分配
  • 【定义】

所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。当系统不会为其自动分配内存时使用。自己分配的内存也要由自己回收。

  • 【用法】

int *pNumber = (int*)malloc(25*sizeof(int)); //存储25个int值得内存
realloc(pNumber,4*sizeof(int));//重新分配内存空间
free(pNumber);//释放内存空间

   char *pname = malloc(10 * sizeof(char));
       //判断分配是否成功
       if (pname == NULL)
       {
           //分配失败
           exit(EXIT_FAILURE);
       }
       
       pname[0]= 'j';
       pname[1]= 'a';
       pname[2]= 'c';
   
       printf("%s\n", pname);
   
       //当内存不够了(多了),就需要在之前基础上重新分配
       //realloc  必须是之前malloc分配过 系统分配不能用
       //用完了就自己释放内存
       realloc(pname,4*sizeof(char));
       pname[3] = 'k';
       free(pname);
       //若在释放后访问,易出错,出现空指针
  • 结构体
  • 【定义】

结构体是一种复合数据类型。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。

  • 【用法】

以下为结构体的声明,若定义在main函数前,则为全局变量,若定义在main函数中,则为局部变量。

       struct 结构体名称 {
            成员
        } 结构体变量名称; 
        //或
        struct 结构体名称 {
            成员
        }; 
        struct Person 结构体变量名称;
  • 文件的用法
  • 基础知识点

mode 文件的操作模式
r 只读 文件不存在就报错 从头开始读
w 只写 文件不存在就创建 从头开始写
a 只写 从末尾开始写
r+ w+ a+ 可读可写

  • 用法

打开文件
FILE *fp = fopen("/Users/ASUS/Desktop/abc.txt", "r");
(前面的“”中为文件地址,可通过win+R,搜索cmd,打开管理员框,将文件拖入查看地址)

  • 可能出现的错误:
    1.若为只读模式,文件不存在将出错;若为写入模式,系统会创建一个新文件
    2 .由于软件和系统的不同而出错,“”中的地址可尝试以下三种方法:
    ①将/改为
    ②在地址前加入C:(所属盘)
    ③vs中找到项目→属性→配置属性→C/C++→预处理器→预处理器定义末尾中加入_CRT_SECURE_NO_WARNINGS

写入数据
fputs("abc", fp);//只能写一个字符串
struct Student{char name[10];int age;};
struct Student xw1 = {"xiaowang", 20};
将结构体写到文件里面去
fwrite(&xw1, sizeof(struct Student), 1, fp);//能写更多数据
读取数据
char temp[20] = {};
fgets(temp, 5, fp);//当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止
printf("%s\n",temp);
struct Student xw1;
fread(&xw1, sizeof(struct Student), 1, fp);//读取所有内容
printf("name: %s\n", xw1.name);
printf("age: %d\n", xw1.age);
关闭文件
fclose(fp);

你可能感兴趣的:(【C语言学习】指针|动态内存分配|结构体|文件的用法)