c語言的學(xué)習(xí)與實踐5(指針,動態(tài)分配內(nèi)存,結(jié)構(gòu)體以及文件的讀取寫入)

1.收獲

今天學(xué)習(xí)了指針的定義,使用,以及它的注意事項,盡管指針有許多的坑,也許我會跌入這個坑中,但是我還是要從跌倒的坑中爬起來,不斷理解,收獲頗多。雖然以前學(xué)過指針,但是只懂一點點,但是通過今天的學(xué)習(xí),明白了許多。在以前只是聽說動態(tài)分配內(nèi)存,不知道怎么做,雖然自己在網(wǎng)上看了一些資料,但是沒有理解,但是今天學(xué)習(xí)動態(tài)分配內(nèi)存之后,感覺它沒有多難,感覺有g(shù)et到了新的知識。在以前學(xué)習(xí)c語言的文件的讀取和寫入這部分時,感覺自己是在聽天書,但是今天我明白怎樣去讀取和寫入,以及怎樣將結(jié)構(gòu)體寫入文件中,這也是以前我不會的,但是現(xiàn)在我會了,這使我的信心大大增加,我明白在編程的道路上是孤獨的,大部分時間時坐在電腦的面前,不斷思考,不斷將代碼寫入,無論在這條路上是多麼困難,都不能放棄,加油?。?

2.技術(shù)

(1).指針的定義,使用以及注意事項
(2).動態(tài)分配內(nèi)存
(3).結(jié)構(gòu)體
(4).文件的讀取和寫入

3.技術(shù)的實際應(yīng)用與解析

(1)指針
c c++ 有指針 多繼承
java 多繼承

C語言 :
為什么要有指針: 解決跨區(qū)域(不同作用域或不同的代碼塊)之間的數(shù)據(jù)交互
指針能夠干什么:地址 內(nèi)存空間
范例:

 int *a;

*a 取a的值
a 表示地址

*表示:
一.聲明/定義變量的時候 表示一個指針變量 int a;

范例:

               float b=20;
              int c=10;
           ***  int *a;定義一個指針變量    指向的內(nèi)存空間只能存放整數(shù)
           ***  注意:定義指針變量的時候一定要給初值   不確定就給NULL

范例:

                *** int *a=b;//不行  指針只能存地址 不能存具體值
               ***  int *a=&b; //不行  整型指針只能存整型數(shù)據(jù)的地址
               ***  int *a=&c;//正確
               ***  float *d=NULL//;NULL指向內(nèi)存的起始地址 0x00

二. 除了定義指針變量之外 都是訪問某個地址的
范例:

              ***  int *temp=&c;//定義指針變量
              ***  *temp=21;//訪問temp地址里面的內(nèi)容  在這里是給c賦值為21

(2)指針與數(shù)組的關(guān)系

注意:
//數(shù)組名并不是一個變量 沒有分配內(nèi)存空間
指針變量是有內(nèi)存空間的

范例:


int score[5]={16,65,9,8,4};
printf_s("%p\n",score);
printf_s("%p\n",&score);

在這里兩者輸出的結(jié)果是相同的,如果數(shù)組名分配內(nèi)存空間
,那么輸出的結(jié)果是不相同的,當(dāng)時這里輸出的結(jié)果是相同的說明數(shù)組名并不是一個變量 沒有分配內(nèi)存空間。

在學(xué)習(xí)完指針后要對指針進行進一步的理解
范例:

for(int i=0;i<5;i++){
    printf_s("%d",*(score+1));
      }
printf_s("%p",score);
printf_s("%p",score+1);
printf_s("%d",*(score+1));
printf_s("%d",*score+1);

在這里%p是對指針變量本身進行輸出
score表示數(shù)組的首地址

而score+1表示score+1=score+類型的字節(jié)數(shù)乘1
*score表示score的指的地址中內(nèi)容

//
printf_s("%d",(*score)++);
printf_s("%d",score[0]);
printf_s("%d",++*score);

這里用了++的知識點,前面的文章已經(jīng)講了,在這里說明一下(score)++,他打印出來時score的內(nèi)容,但是后面就執(zhí)行了++,所以score[0]就比原來多一,因為score=score[0]

//定義一個數(shù)組 系統(tǒng)會分配內(nèi)存空間 可以存值

   int num[10]={};

定義一個指針變量 只為變量本身分配8個字節(jié)的空間 無法存值,因為沒有為他分配內(nèi)存空間
范例:

   int *p;
  num[2]=20;可以
  *p=20;不行

因為這里的指針沒有指向任何區(qū)域

//如果想給指針指向的的區(qū)域賦值
// (1).指針變量已經(jīng)指向某塊區(qū)域

int a=10;
int *p=&a;
*p=30;

** //(2).指針指向一個數(shù)組**

int num[10]={};
int *p=num;

*(p+0)=20;
p[0]=20;

*(p+1)=30;
p[1]=30;

(3).動態(tài)分配內(nèi)存
動態(tài)分配內(nèi)存
三個用到的 malloc realloc
//上面兩種指向的內(nèi)存是別人的
//希望分配屬于自己的內(nèi)存空間
free
//自己分配的內(nèi)存空間必須自己釋放
//普通變量的內(nèi)存是系統(tǒng)自己分配的 所以系統(tǒng)自己負(fù)責(zé)釋放

//需要導(dǎo)入文件

#include "stdlib.h"

//開始自己分配內(nèi)存

char *p=malloc(3*sizeof(char));
//判斷是否成功
if(p==NULL)p{
//分配失敗
   //退出
    exit(EXIT_FAILURE);
      }
P[0]='j';
p[1]='l';
p[2]='m';
printf_s("%s\n",p);

在這里打印出來結(jié)果是ijm

//當(dāng)自己申請的內(nèi)存空間不夠了或多了 就需要在之前的基礎(chǔ)上重新分配
//realloc 必須是之前使用malloc分配過的
//如果是系統(tǒng)分配的內(nèi)存 是不能用realloc的

p=realloc(p,4*sizeof(char));
p[3]='h';
//也要判斷是否分配成功
if(p==NULL)p{
//分配失敗
   //退出
    exit(EXIT_FAILURE);
      }
//用完了就要自己釋放內(nèi)存
     free(p);

其實動態(tài)分配內(nèi)存不是那磨難

(4)結(jié)構(gòu)體以及結(jié)構(gòu)體的讀入文件
定義
結(jié)構(gòu)體// 是一種數(shù)據(jù)類型 復(fù)合數(shù)據(jù)類型

//struct
//聲明一種類型 struct Person


struct Person{
   char *addr;
   char name[10];
   int age;
    };
  //定義結(jié)構(gòu)體變量
  int i;
  i=20;
  struct Person xw;
  xw.name="小王";錯的//數(shù)組一旦定義  地址不能改變
                 //不能直接給數(shù)組賦值
  xw.name[0]='x';//系統(tǒng)為這個變量分配內(nèi)存了
  xw.name[1]='w';

//xw.addr="西南大學(xué)"http://可以的 常量字符串的地址是由系統(tǒng)分配的
xw.addr[0]='s';//字符指針賦值 必須要有內(nèi)存 這樣是不對的

如何將結(jié)構(gòu)體讀入和讀取
//首先聲明

#include "stdlib.h"

//打開文件

FILE *p;
    fopen_s(&p,"C:/Users/ASUS/Desktop/ABC.txt","w"); 
if(p!=NULL){
      printf_s("該文件打開成功\n"); 
    /}
   else printf_s("該文件打開失敗\n"); 

//定義一個結(jié)構(gòu)體

    struct Student{
       char name[20];
       int age;
       float score;
      };
struct Student student1={"xiaowang",20,89.23};

//將結(jié)構(gòu)體寫入文件

fwrite(&student1,sizeof(struct Student),1,p);

//讀取文件
在這里需要注意在讀取時是不需要再寫入文件的嗎,因為前面已經(jīng)寫入文件了
定義一個新的結(jié)構(gòu)體變量

FILE *p;
    fopen_s(&p,"C:/Users/ASUS/Desktop/ABC.txt","r"); 
struct Student student1={};

//讀取數(shù)據(jù)

    fread(&student1,sizeof(struct Student),1,p);
    printf_s("name:%s\n",student1.name);
    printf_s("age:%d\n",student1.age);
    printf_s("score:%0.2f\n",student1.score);

//關(guān)閉文件

    fclose(p);
    printf_s("文件已保存\n");

(5)文件的讀取和寫入
//打開文件

    FILE *p;
    fopen_s(&p,"C:/Users/ASUS/Desktop/ABC.txt","w"); 
if(p!=NULL){
      printf_s("該文件打開成功\n"); 
     }
    else printf_s("該文件打開失敗\n"); 

//寫入文件(在終端中輸入xiaowang#)

    fputs("c",p);
    printf_s("請輸入需要寫入的字符(以#結(jié)束):");
      char ch=getchar();
    while(ch!='#'){
      fputc(ch,p);
      ch=getchar();
     }
    printf_s("\n");

然后文件中就有

QQ圖片20190804205817.png

//讀取數(shù)據(jù)

char name[10]={};
fgets(name,8,p);//這里的數(shù)字是表示讀取多少個字符
printf_s("%s\n",name);

最終將“xiaowang”讀出
//關(guān)閉文件

    fclose(p);
    printf_s("文件已保存\n");
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容