c語(yǔ)言-----指針
1.聲明/定義變量的時(shí)候 表示一個(gè)指針變量
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
2.除了定義指針變量之外 都是訪問(wèn)某個(gè)地址的值
int *temp = &c;//定義指針變量l
*temp = 21; 訪問(wèn)temp地址里面的數(shù)據(jù) 賦值為21
//‘&’ 取某個(gè)變量的地址
3.要學(xué)好指針就要抓住兩點(diǎn) (1)地址 (2)內(nèi)存空間
為什么要用指針:解決跨區(qū)域(不同作用域 不同代碼塊)之間的數(shù)據(jù)交互
指針最忌諱的:野指針:也就是指向不可用內(nèi)存區(qū)域的指針。通常對(duì)這種指針進(jìn)行操作的話,將會(huì)使程序發(fā)生不可預(yù)知的錯(cuò)誤咪惠。
注:指針變量在內(nèi)存里面占據(jù)8個(gè)字節(jié)空間
int main(int argc, const char * argv[]) {
int a = 10废封;
int *pa = &a;
int a2[10] = {};
int *pa2 = a2;
int(*pFunc)(int) = test;
char c = 'a';
char *pc = &c;
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
printf("%lu\n", sizeof(pc));//8
4.數(shù)組與指針在內(nèi)存上的差別:
數(shù)組名并不是一個(gè)變量 沒(méi)有分配內(nèi)存空間 int a = 10;
指針變量是有內(nèi)存空間
定義一個(gè)數(shù)組 系統(tǒng)會(huì)分配內(nèi)存空間 可以存值
int num[10] = {};
定義一個(gè)指針變量 只為變量本身分配8個(gè)字節(jié)內(nèi)存空間
(無(wú)法存值穆役,因?yàn)闆](méi)有為他分配可以存值的內(nèi)存空間)
int *p;
給指針指向的區(qū)域賦值:
1.指針變量已經(jīng)指向某塊區(qū)域
int a3 = 10;
int *pA = &a3; //指向變量a的內(nèi)存地址
*pA = 30;
2.指針指向一個(gè)數(shù)組
int num2[10] = {};
int *pNum = num2; //指向數(shù)組num2的首地址
*(pNum+0) = 20; 等價(jià)于 pNum[0] = 20;
*(pNum + 1) = 30; 等價(jià)于 pNum[1] = 30;
C語(yǔ)言————?jiǎng)討B(tài)存儲(chǔ)
3.動(dòng)態(tài)分配內(nèi)存
三個(gè)點(diǎn): malloc realloc free
上面兩種指向的內(nèi)存都是別人的,是系統(tǒng)分配的,一般當(dāng)出了作用域 內(nèi)存就會(huì)被釋放。
而此方法希望分配一個(gè)屬于自己的內(nèi)存空間
自己分配的內(nèi)存空間必須自己釋放
注:普通變量的內(nèi)存是系統(tǒng)自己分配 所以系統(tǒng)自己負(fù)責(zé)釋放
char *pName = malloc(3 * sizeof(char));
//判斷分配是否成功
if(pName == NULL){
//分配失敗
exit(EXIT_FAILURE);
}
//若分配成功奄喂,使:
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c';
//當(dāng)之前分配的內(nèi)存空間不夠了 就需要在之前的基礎(chǔ)上重新分配
//realloc 必須是之前使用malloc分配過(guò)的
//malloc分配的內(nèi)存不夠用時(shí),用realloc增加分配內(nèi)存 并將malloc 上的內(nèi)容復(fù)制過(guò)去 并將之前malloc分配的內(nèi)存清除
//如果是系統(tǒng)分配的內(nèi)存 是不能使用realloc的
//用完了就要自己釋放內(nèi)存
pName = realloc(pName, 4*sizeof(char));
pName[3] = 'k';
printf("%s\n", pName);
free(pName);
return 0;
}
C語(yǔ)言————結(jié)構(gòu)體
結(jié)構(gòu)體 是一種復(fù)合數(shù)據(jù)類型
//struct
//聲明一種類型 struct Person == int
struct Person {
char name[10];
char *addr;
int age;
};
// int i1 = 10;
// struct Person zs = {"張三", 20};
//定義結(jié)構(gòu)體struct Person變量 變量名xw
int i;
i = 20;
struct Person xw;
//xw.name = "小王";此用法錯(cuò)誤:M荨跨新! *數(shù)組一旦定義 地址不能改變
//不能直接給數(shù)組賦值
xw.name[0] = 'x';//系統(tǒng)為這個(gè)變量分配內(nèi)存了
xw.name[1] = 'w';
//xw.addr = "西南大學(xué)";此用法正確 *常量字符串的地址是由系統(tǒng)分配的
//先為addr分配內(nèi)存
xw.addr = malloc(4 * sizeof(char));
xw.addr[0] = 'S';//字符指針賦值 必須要有內(nèi)存
xw.addr[1] = 'o';
xw.addr[2] = 'u';
xw.addr[3] = 't';
xw.age = 30;
printf("name:%s\n", xw.name);
printf("addr:%s\n", xw.addr);
C語(yǔ)言————文件操作
寫(xiě)入數(shù)據(jù):
int main(int argc, const char * argv[]) {
//打開(kāi)文件
//fopen("abc.txt",const char *restrict __mode) ;
FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","w");
//寫(xiě)入結(jié)構(gòu)體
struct Student{
char name[10];
int age;
};
struct Student xw1={"小紅",20};
fwrite(&xw1,sizeof(struct Student),1,fp);
fclose(fp);
return 0;
}
讀取數(shù)據(jù):
int main(int argc, const char * argv[]) {
//打開(kāi)文件
//fopen("abc.txt",const char *restrict __mode) ;
FILE *fp=fopen("C:/Users/12931/Desktop/abc1.txt","r");
//寫(xiě)入結(jié)構(gòu)體
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);
return 0;
}
心得:
此次指針學(xué)習(xí)讓我感受到了C語(yǔ)言的精髓所在,動(dòng)態(tài)分配內(nèi)存更是讓我大開(kāi)眼界 感覺(jué)牛逼的亞子坏逢,當(dāng)然域帐,指針的確比較難,有好多地方像是在讀無(wú)字天書(shū)是整,就是懂不了肖揣,鏈表更是聽(tīng)的云里霧里,似懂非懂的浮入。感覺(jué)自己不懂的還有好多许饿,不過(guò)今天也學(xué)習(xí)了好多指針、結(jié)構(gòu)體舵盈、動(dòng)態(tài)分配內(nèi)存的基礎(chǔ)知識(shí),也算很有收獲球化!