美文网首页
C语言-(指针、动态分配内存、结构体、创建文件)

C语言-(指针、动态分配内存、结构体、创建文件)

作者: 宁晓鸯 | 来源:发表于2019-08-04 00:47 被阅读0次

心得体会

  • 今天是c语言学习的最后一天,我们终于学到了指针部分。整天课下来我是听得云里雾里的,大脑并不能很快的反应过来,尤其是最后编写demo的部分,对我来说很是困难,可以说上课的时候我几乎完全没有听懂。但是,有时候人真的是愈战愈勇,虽然真的很困难,但是我还是要尽全力去把他搞懂,说不定,接下来将会海阔天空呢^^.

技术

  • 指针

  • c语言动态分配内存

  • 结构体

  • 将结构体写入文件


操作以及操作详解

  • 指针
    1.什么是指针

其实指针就像是其它变量一样,所不同的是一般的变量包含的是实际的真实的数据,而指针包含的是一个指向内存中某个位置的地址。

2.为什么要使用指针

a.指针解决跨区域(不同作用域 不同代码块)之间的数据交互
b.为函数提供修改调用变元的灵活手段;
c.支持C 语言动态分配子程序
d.可以改善某些子程序的效率
e.为动态数据结构(如二叉树、链表)提供支持

3.指针中符号-------------'*'表示的含义

a.声明定义变量的时候 表示一个指针变量
int*a//定义指针变量
int *temp=&c//定义指针变量
b.除了定义指针变量之外 都是访问个地址的值
*temp=21;//访问temp地址里面的数据 赋值为21

4.指针的使用注意事项

a.int *a;此时定义一个指针变量,指向的内存空间只能存放整数
b.定义指针变量的时候一定要赋初值

c.
float b=20;
int c=10;
int *a=b; //错误;指针变量只能存地址,不能存具体值***a=&b)`
int *a=&b;//错误 整形指针只能存整形数据的地址
int *a=&c;//正确
float *d=NULL;//NULL指向内存的首地址 0x00
d.
#include <iostream.h>
  int test(int a){
    return 0;
 }
 int main(int argc, char *argv[])
  { int a=10;
    int *pa=&a;

    int a2[10]={};
    int *pa2=a2;

    int(*pFunc)(int )=test;//这是一个函数,函数的函数名实际上就是这个代码在内存中的首地址,所以test前面不加& 
    printf("%lu\n",sizeof(a)); //4
    printf("%lu\n",sizeof(*pa));//8
    printf("%lu\n",sizeof(a2));//40
    printf("%lu\n",sizeof(*pa2));//8
    printf("%lu\n",sizeof(pFunc));//8
  //sizeof判断某一种类型在内存里面占据的内存空间是多少 
    system("pause"); 
    return 0;
}

5.指针与数组的关系

a.数组名并不是 一个变量 没有分配内存空间 int a=10;指针变量是有内存空间的
b.定义一个数组,系统会分配内存空间;定义一个指针变量 只为变量本身分配8个字节内存空间

  #include <iostream.h>
   int main(int argc, char *argv[])
  {int score[5]={39,32,34,67,89};
    printf("%p\n",score);
    printf("%p\n",&score);
    system("pause");
    return 0;
}
QQ截图20190803225355.png

从上述结果可以看出两种输出结果是一样的,故由此可得:数组名其实就是数组的首地址


int score[5]={39,32,34,67,89};
    for(int i=0;i<5;i++){
        printf("%d ",score[i]);
    }
    
    for(int i=0;i<5;i++){
        printf("%d ",*(score+1));
    }
QQ截图20190803231800.png
int score[5]={39,32,34,67,89};
    printf("%p\n",score);
    printf("%p\n",score+1);
    printf("%d\n",*(score+1));
    printf("%d\n",*score+1);
QQ截图20190803232146.png
int score[5]={39,32,34,67,89};
    printf("%d\n",(*score)++);
    printf("%d\n",score[0]);
    printf("%d\n",++*score);
QQ截图20190803232445.png

注意!!!
这里有一个坑,第一次打印是39,第一次打印过后就加1变成了40,所以第二次打印是40;


  • c语言动态分配内存

a.自己分配的内存必须自己释放,普通变量的内存是系统自己分配, 所以系统自己负责释放
b.步骤:创建了一个内存空间--->判断分配是否成功--->当之前分配的内存空间多了或少了 ,就需要在之前前的基础上重新分配--->内存空间用完后需立刻释放内存空间

char *pName=malloc(10*sizeof(char));//创建了一个内存空间
if(pName==NULL){//判断分配是否成功
    //r如果分配失败
    return;(exit(EXIT_FAILURE))
}
pName[0]='j';
pName[1]='a';
pName[2]='c';
printf("%s",pName);
//当之前分配的内存空间多了或少了 就需要在职期前的基础上重新分配
//realloc 必须是之前使用malloc分配过的
pName=realloc(pName,4*sizeof(char));//重新分配内存空间
pName[3]='k';
free(pName);//用完了就要自己释放内存

  • 结构体
    什么是结构体

结构体是一种数据类型 复合数据类型

//声明一种类型 struct Person
struct Person{
    char name[10];
    char *addr;
    int age;
};
//定义结构体变量 变量名为xw

struct Person xw;
xw.name="小王";//错误!!!
xw.name[0]='x';//正确

数组一旦定义 地址不能改变;
不能直接给数组赋值;

  • 将结构体写入文件
    a.运行思路

把什么东西写到文件里---这个东西有多大---写到哪里去---写几个


1.把结构体写到文件
步骤:打开电脑的cmd---将你想要写的文件的地址的任意一个文件拖到cmd中----将文件名改为你所要创建的文件名----得到文件的完全路径---把完全路径写入fopen()中

#include <stdio.h>

int main(int argc, char *argv[])
{ 
    FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","w");
    struct Student{
        char name[10];
        int age;
    };
struct Student xw1={"xiaowang",20};
fwrite(&xw1,sizeof(struct Student),1,fp);
system("pause");
return 0;
}
K)3IUNYPHB[]~NEMMPXPW~Q.png
RZBDXGF{U0AJD3~JHN()DXC.png

2.接下来以只读方式打开文件

int main(int argc, char *argv[])
{ 
    FILE *fp=fopen("C:/Users/Administrator.000/Desktop/abcd.txt","r");
    struct Student{
        char name[10];
        int age;
    };
    struct Student xw1;
    fread(&xw1,sizeof(struct Student),1,fp);
    printf("name:%s\n",xw1.name);
    printf("age:%d\n",xw1.age);
    fclose(fp);

    system("pause");
    return 0;
}
QQ截图20190804001929.png

在调用 fopen() 函数时,这些信息都必须提供,称为“文件打开方式”。最基本的文件打开方式有以下几种:


QQ截图20190804144435.png

文件一旦使用完毕,应该用 fclose() 函数把文件关闭,以释放相关资源,避免数据丢失。fclose() 的用法为:
int fclose(FILE *fp);
fp 为文件指针。例如:
fclose(fp);
文件正常关闭时,fclose() 的返回值为0,如果返回非零值则表示有错误发生。

相关文章

  • C语言-(指针、动态分配内存、结构体、创建文件)

    心得体会 今天是c语言学习的最后一天,我们终于学到了指针部分。整天课下来我是听得云里雾里的,大脑并不能很快的反应过...

  • C语言——第四次笔记

    指针指针的定义指针的类型指针的指向内容指针的运算数组与指针指针与函数动态分配内存结构体文件读写头文件与实现文件实例...

  • C语言续

    指针指针的定义指针的类型指针的指向内容指针的运算数组与指针指针与函数动态分配内存结构体文件读写头文件与实现文件实例...

  • Golang 指针和结构体

    Golang 指针和结构体 于c语言相同,go中也有指针和结构体的概念。指针表示变量的内存地址,结构体用来存储同一...

  • 结构体操作

    1.动态创建一个结构体,里面有指针,为指针对象创建内存 结构体定义 释放结构体

  • 指针是C语言中重要数据类型,利用指针可以有效的表示复杂的数据结构,实现动态分配内存,更方便、更灵活的使用数组、...

  • C语言20 结构体指针

    C语言20 结构体指针 探测结构体指针的特性 ++、-- 加法与减法 指针相减 使用结构体指针 结构体指针一定要指...

  • c语言 2018-05-29

    c语言文件结构 (-> and .) 定义结构体指针,访问成员时就用->定义结构体变量,访问成员时就用.例如:ty...

  • iOS新手的进阶之路

    一、C语言基础 基本数据类型、基本运算、函数、数组、字符串、指针、结构体、预处理指令、枚举、文件操作、内存管理 二...

  • iOS开发学习计划

    一、C语言基础 基本数据类型、基本运算、函数、数组、字符串、指针、结构体、预处理指令、枚举、文件操作、内存管理 二...

网友评论

      本文标题:C语言-(指针、动态分配内存、结构体、创建文件)

      本文链接:https://www.haomeiwen.com/subject/uscsdctx.html