Android Day6
內(nèi)容:
Ⅰ指針
Ⅱ結(jié)構(gòu)體 struct
Ⅲfopen的使用
實踐:
Ⅰ指針
1. 數(shù)組和指針的關(guān)系
數(shù)組名并不是一個變量 沒有分配內(nèi)存空間
指針變量時有內(nèi)存空間
2.C語言為什么要引入指針
訪問變量都需要地址
解決跨區(qū)域(不同作用域 不同代碼塊)之間的數(shù)據(jù)交互
3.常量指針 指針常量 指向常量的指針
指針常量的本質(zhì)是一個常量男韧,而用指針修飾它,這個常量的值應(yīng)該是一個指針玻淑。
指針常量的值是指針撇他,這個值是常量樱拴,所以不能被賦值爹土》那遥看帮坚,常量指針本質(zhì)是指針妻往,常量修飾它,表示這個指針乃是一個指向常量的指針變量试和。指針指向的對象是常量讯泣,那么這個對象不能被更改。
指向常量的指針常量就是一個常量阅悍,且它指向的對象也是一個常量
'*'表示1.聲明/定義一個變量的時候 表示一個指針
int *a好渠;定義一個指針變量 指向的內(nèi)存空間只能存放整數(shù)
ps:定義指針的時候一定要給初值 不確定時給NULL,表示指向內(nèi)存的起始地址 0x00
int *a = b; (x) 指針變量只能存地址 不能存具體值
int *a = &b; (√) 其中b必須為整型地址节视,若為其他類型則不正確
5.除了定義指針變量之外 都是訪問某個地址的值
exp2:*temp = 21;表示訪問temp地址里面的數(shù)據(jù) 賦值為21
'&'表示取某個變量的地址
exp3:
賦值的兩種方法
int a = 10;
int *pa = &a;
int a2[10] = {}拳锚;
int *pa2 = a2; 默認(rèn)把數(shù)組的首地址賦給指針
int test (int a){
return 0;}
int(*paFunc)(int) = test;
只要是指針變量 不論類型都占8個字節(jié)內(nèi)存空間
printf(%lu)sizeof(a) 4
sizeof(pa) 8
sizeof(a2) 40
sizeof(pa2) 8
sizeof(pFunc) 8
6.定義一個數(shù)組 系統(tǒng)會分配內(nèi)存空間 可以存值
定義一個指針變量 只為變量本身分配8個字節(jié)內(nèi)存空間
如果要給指針指向的區(qū)域賦值
(1)指針變量已經(jīng)指向某塊區(qū)域
int a3 = 10;
int *pa = &a3寻行;
*pa = 30霍掺;
(2)指針指向一個數(shù)組
int num2[10] = {};
int *pNum = num2; //指向數(shù)組num2的首地址
*(pNum + 0) = 20;
pNum[0] = 20; //487 488兩式等價
(3)動態(tài)分配內(nèi)存
以上兩種指向的內(nèi)存都是別人的
希望分配一個屬于自己的內(nèi)存空間
自己分配的內(nèi)存空間必須自己釋放
普通變量的內(nèi)存是系統(tǒng)自己分配 所以系統(tǒng)自己負(fù)責(zé)釋放
char *pName malloc(10 * sizeof(char)); 返回地址 接收地址
//判斷分配是否成功
if(pName == NULL){
//分配失敗
exit(EXIT_FAILURE);
}
pName[0] = 'j';
pName[1] = 'a';
pName[2] = 'c'; //浪費內(nèi)存空間 分配了10個 只用了3個 需要釋放內(nèi)存
printf("%s\n", pName);
//如果之前分配的內(nèi)存空間不夠了 就需要在之前的基礎(chǔ)上重新分配
//realloc 必須是之前使用malloc分配過的
//如果是系統(tǒng)分配的內(nèi)存 則不能使用realloc
pName = realloc(pName,4 * sizeof(char));
pName[3] = 'k';
//釋放內(nèi)存
free(pName); //已經(jīng)釋放的內(nèi)存不能再使用 使用會出現(xiàn)空指針異常
char *pTemp;
*pTemp = 'A';(X)只為變量本身分配8個內(nèi)存空間 賦值則沒有空間 需要動態(tài)分配內(nèi)存
Ⅱ結(jié)構(gòu)體 struct
結(jié)構(gòu)體 struct
是一種數(shù)據(jù)類型 復(fù)合數(shù)據(jù)類型
struct Person {
char name[10];
int age;
};
int i;
i = 20;
struct Person xw;
//數(shù)組一旦定義 地址不能改變
//不能直接給數(shù)組賦值
xw.name[0] = 'x';
xw.name[1] = 'w';
//常量字符串的地址是由系統(tǒng)自動分配的 char * addr;
xw.addr = "西南大學(xué)";
//字符指針必須分配內(nèi)存
xw.age = 30; //訪問結(jié)構(gòu)體用 .
int i1 = 10;
struct Person zs = {"張三", 20}
在結(jié)構(gòu)體內(nèi)定義的變量注意 不同種類變量遇到總是要對齊
占字節(jié)小的向最近的對齊 順序不同可能占字節(jié)不同
Ⅲfopen的使用
使用 <stdio.h> 頭文件中的 fopen() 函數(shù)即可打開文件寡痰,它的用法為:
FILE *fopen(char *filename, char *mode)
filename為文件名(包括文件路徑)抗楔,mode為打開方式,它們都是字符串
如果希望接收 fopen() 的返回值拦坠,就需要定義一個 FILE 類型的指針
FILE *fp = fopen("demo.txt", "r");
感想
今天講了用鏈表編寫學(xué)生管理系統(tǒng)连躏,聽的迷迷糊糊,大概不是我這個水平能寫出來的東西吧贞滨,很吃力入热,不過加油吧拍棕,努力總有回報的