1.收獲
今天學(xué)習(xí)了指針的定義,使用盯蝴,以及它的注意事項(xiàng)毅哗,盡管指針有許多的坑,也許我會(huì)跌入這個(gè)坑中捧挺,但是我還是要從跌倒的坑中爬起來虑绵,不斷理解,收獲頗多闽烙。雖然以前學(xué)過指針翅睛,但是只懂一點(diǎn)點(diǎn),但是通過今天的學(xué)習(xí)黑竞,明白了許多捕发。在以前只是聽說動(dòng)態(tài)分配內(nèi)存,不知道怎么做很魂,雖然自己在網(wǎng)上看了一些資料扎酷,但是沒有理解,但是今天學(xué)習(xí)動(dòng)態(tài)分配內(nèi)存之后遏匆,感覺它沒有多難法挨,感覺有g(shù)et到了新的知識(shí)。在以前學(xué)習(xí)c語(yǔ)言的文件的讀取和寫入這部分時(shí)幅聘,感覺自己是在聽天書坷剧,但是今天我明白怎樣去讀取和寫入,以及怎樣將結(jié)構(gòu)體寫入文件中喊暖,這也是以前我不會(huì)的闯割,但是現(xiàn)在我會(huì)了兽愤,這使我的信心大大增加县匠,我明白在編程的道路上是孤獨(dú)的肥缔,大部分時(shí)間時(shí)坐在電腦的面前,不斷思考巩掺,不斷將代碼寫入偏序,無(wú)論在這條路上是多麼困難,都不能放棄胖替,加油Q腥濉豫缨!!
2.技術(shù)
(1).指針的定義,使用以及注意事項(xiàng)
(2).動(dòng)態(tài)分配內(nèi)存
(3).結(jié)構(gòu)體
(4).文件的讀取和寫入
3.技術(shù)的實(shí)際應(yīng)用與解析
(1)指針
c c++ 有指針 多繼承
java 多繼承
C語(yǔ)言 :
為什么要有指針: 解決跨區(qū)域(不同作用域或不同的代碼塊)之間的數(shù)據(jù)交互
指針能夠干什么:地址 內(nèi)存空間
范例:
int *a;
*a 取a的值
a 表示地址
*表示:
一.聲明/定義變量的時(shí)候 表示一個(gè)指針變量 int a;
范例:
float b=20;
int c=10;
*** int *a;定義一個(gè)指針變量 指向的內(nèi)存空間只能存放整數(shù)
*** 注意:定義指針變量的時(shí)候一定要給初值 不確定就給NULL
范例:
*** int *a=b;//不行 指針只能存地址 不能存具體值
*** int *a=&b; //不行 整型指針只能存整型數(shù)據(jù)的地址
*** int *a=&c;//正確
*** float *d=NULL//;NULL指向內(nèi)存的起始地址 0x00
二. 除了定義指針變量之外 都是訪問某個(gè)地址的
范例:
*** int *temp=&c;//定義指針變量
*** *temp=21;//訪問temp地址里面的內(nèi)容 在這里是給c賦值為21
(2)指針與數(shù)組的關(guān)系
注意:
//數(shù)組名并不是一個(gè)變量 沒有分配內(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)時(shí)這里輸出的結(jié)果是相同的說明數(shù)組名并不是一個(gè)變量 沒有分配內(nèi)存空間冲呢。
在學(xué)習(xí)完指針后要對(duì)指針進(jìn)行進(jìn)一步的理解
范例:
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是對(duì)指針變量本身進(jìn)行輸出
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);
這里用了++的知識(shí)點(diǎn)舍败,前面的文章已經(jīng)講了,在這里說明一下(score)++敬拓,他打印出來時(shí)score的內(nèi)容邻薯,但是后面就執(zhí)行了++,所以score[0]就比原來多一乘凸,因?yàn)?/em>score=score[0]
//定義一個(gè)數(shù)組 系統(tǒng)會(huì)分配內(nèi)存空間 可以存值
int num[10]={};
定義一個(gè)指針變量 只為變量本身分配8個(gè)字節(jié)的空間 無(wú)法存值厕诡,因?yàn)闆]有為他分配內(nèi)存空間
范例:
int *p;
num[2]=20;可以
*p=20;不行
因?yàn)檫@里的指針沒有指向任何區(qū)域
//如果想給指針指向的的區(qū)域賦值
// (1).指針變量已經(jīng)指向某塊區(qū)域
int a=10;
int *p=&a;
*p=30;
** //(2).指針指向一個(gè)數(shù)組**
int num[10]={};
int *p=num;
*(p+0)=20;
p[0]=20;
*(p+1)=30;
p[1]=30;
(3).動(dòng)態(tài)分配內(nèi)存
動(dòng)態(tài)分配內(nèi)存
三個(gè)用到的 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)自己申請(qǐ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);
其實(shí)動(dòng)態(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="小王";錯(cuò)的//數(shù)組一旦定義 地址不能改變
//不能直接給數(shù)組賦值
xw.name[0]='x';//系統(tǒng)為這個(gè)變量分配內(nèi)存了
xw.name[1]='w';
//xw.addr="西南大學(xué)"http://可以的 常量字符串的地址是由系統(tǒng)分配的
xw.addr[0]='s';//字符指針賦值 必須要有內(nèi)存 這樣是不對(duì)的
如何將結(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");
//定義一個(gè)結(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);
//讀取文件
在這里需要注意在讀取時(shí)是不需要再寫入文件的嗎,因?yàn)榍懊嬉呀?jīng)寫入文件了
定義一個(gè)新的結(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("請(qǐng)輸入需要寫入的字符(以#結(jié)束):");
char ch=getchar();
while(ch!='#'){
fputc(ch,p);
ch=getchar();
}
printf_s("\n");
然后文件中就有
//讀取數(shù)據(jù)
char name[10]={};
fgets(name,8,p);//這里的數(shù)字是表示讀取多少個(gè)字符
printf_s("%s\n",name);
最終將“xiaowang”讀出
//關(guān)閉文件
fclose(p);
printf_s("文件已保存\n");