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

心得感悟

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


1. 目的

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

2. 技术

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

3. 技术的使用

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

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

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

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

\color{#ea4335}{注意:定义指针变量时一定要赋初值或赋值为NULL,NULL指向内存的起始地址为0x00}

  • 【用法】

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

'&'表示取某个变量的地址
\color{#ea4335}{指针变量本身在内存里占8个字节},举点例子来解释指针所占的内存:

   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);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容