C語言指針地梨,結(jié)構(gòu)體菊卷,以及文件操作學(xué)習(xí)

一、學(xué)習(xí)目的

指針是C語言中的一種概念湿刽,正確而靈活地運(yùn)用指針可以使程序簡潔的烁,緊湊。 指針能夠解決跨區(qū)域(不同作用域诈闺,不同的代碼塊)之間的數(shù)據(jù)交互渴庆,為程序編寫提供很大的便利;
C語言提供了一些由系統(tǒng)已定義好的數(shù)據(jù)類型雅镊,也允許用戶建立自己的由不同數(shù)據(jù)組成的組合型的數(shù)據(jù)結(jié)構(gòu)襟雷,稱為結(jié)構(gòu)體,結(jié)構(gòu)體增加了數(shù)據(jù)之間的內(nèi)在聯(lián)系

二仁烹、學(xué)習(xí)內(nèi)容

1耸弄,指針

將地址形象化地稱為“指針”
‘*’:1,表示聲明定義變量的時(shí)候 表示一個(gè)指針變量
int *p;定義一個(gè)指針變量卓缰,這個(gè)指針變量只能存放地址(int類型的地址)计呈,不能存放具體的數(shù);它指向的內(nèi)存空間只能存放整數(shù)
注意:定義指針變量一定要給初值 不確定時(shí)賦值NULL;
float *c = NULL;NULL指向內(nèi)存的起始地址
2征唬,除了定義指針變量外 那就是訪問某個(gè)地址的值

   float a = 100.1;
   float *c = &a;
   printf("%f",*c); 輸出100.1捌显;

‘&’:取某個(gè)變量的地址

 void test(int *temp){ //temp實(shí)參
temp++;
 }
  int test1(int a){
   a++;
return 0;
 }
int _tmain(int argc, _TCHAR* argv[])
  {
  int a = 10;
  int *pa = &a;
test(&a); //a的值發(fā)生改變  a實(shí)參
    test1(a)   //a的值不變,形參
     int(*pFunc)(int) = test1; //函數(shù)指針    函數(shù)名就是函數(shù)在內(nèi)存中的首地址

指針變量占八個(gè)字節(jié) 总寒,注意:sizeof(數(shù)組名)會(huì)打印出整個(gè)數(shù)組所占的內(nèi)存空間扶歪,而不是數(shù)組首個(gè)元素的所占的內(nèi)存

printf("%lu\n",sizeof(a));  //輸出 4
printf("%lu\n",sizeof(pa)); //輸出 8
printf("%lu\n",sizeof(a2)); //40  數(shù)組名  打印整個(gè)數(shù)組在內(nèi)存中占據(jù)的字節(jié)
printf("%lu\n",sizeof(pa2)); //8 
printf("%lu\n",sizeof(pFunc)); //8  指針變量(不管什么類型)在64位系統(tǒng)占8個(gè)字節(jié)

指針和數(shù)組的關(guān)系:數(shù)組名并不是一個(gè)變量,沒有分配內(nèi)存空間 指針變量有內(nèi)存空間摄闸;區(qū)別:定義一個(gè)數(shù)組 系統(tǒng)會(huì)分配內(nèi)存空間 可以存值

 int score[5] = {91,92,93,94,95};
printf("%p\n",score); // 輸出0078F968
printf("%p\n",&score);//輸出0078F968
for(int i=0;i<5;i++){
    printf("%d  ",score[i]);
}
for(int i=0;i<5;i++){
    printf("%d  ",*(score+i));
}


printf("%p\n",score);
printf("%p\n",score+1);
printf("%d\n",*(score+1)); 
printf("%d\n",*score+1);     //score[0]+1

printf("%d\n",(*score)++); //91
printf("%d\n",score[0]);  //92   前面已經(jīng)+1
printf("%d\n",++(*score)); //93  再次+1然后輸出

指針變量存值的存值的三種方式:

1善镰,指針變量已指向某塊區(qū)域

int a3=10;
int *p = &a3;
*p = 30;//賦值正確

2,,指針指向一個(gè)數(shù)組

int num2[10]={};
int *pNum = num2;
*(pNum+1) = 20;
pNum[1] = 30;     //*(pNum+i)相當(dāng)于pNum[i];

第一年枕,第二種都是變量和數(shù)組已經(jīng)分配了內(nèi)存空間炫欺,指針指向變量和數(shù)組,所以能夠操作這些空間熏兄,因此能夠賦值品洛;
3,動(dòng)態(tài)分配內(nèi)存 用malloc() realloc() 方法
注意:自己分配的內(nèi)存空間必須自己釋放 free(); 普通變量的內(nèi)存是系統(tǒng)分配的霍弹,由系統(tǒng)自己釋放

char *pName  = malloc(3 * sizeof(char));
//判斷分配是否成功
if(pName == NULL){
    //分配失敗
    exit(EXIT_FAILURE);
}
pName[0] = 'x';
pName[1] = 'w';
pName[2] = 'j';
printf("%s\n",pName);

當(dāng)之前分配的內(nèi)存不夠是時(shí)毫别,就需要在之前的基礎(chǔ)上重新分配 ;realloc() 必須是之前malloc分配的內(nèi)存才可以用realloc重新再分配 系統(tǒng)自己分配的內(nèi)存空間不能用這個(gè)方法

pName = realloc(pName,4*sizeof(char));
pName[4] = 'o';
printf("%s\n",pName);
free(pName);  //釋放內(nèi)存
2典格,結(jié)構(gòu)體

結(jié)構(gòu)體:聲明一種類型 struct Person 類比int float char類型

struct Person{
    char name[10];
    int age;
    char *addr;
};
//定義一個(gè)結(jié)構(gòu)體變量變量
Person per1;

Person per2 = {"zhangsan",19};
per1.name = "lisi"; //出錯(cuò) 數(shù)組一旦定義 地址不能改變  
                    //不能直接給數(shù)組賦值

//若要賦值
per1.name[0] = 'l';
per1.name[1] = 'i';
per1.name[2] = 's';
per1.name[3] = 'i';

// per1.addr = "西南大學(xué)";   //正確  常量字符串的地址是由系統(tǒng)自動(dòng)分配的
 
per1.addr[0] = 'S';
per1.addr[1] = 'W';
per1.addr[2] = 'U'; //出錯(cuò) 字符指針賦值 必須要有內(nèi)存 賦值前必須分配內(nèi)存空間 per1.addr = malloc(4*sizeof(char));


//  typedef  類型重命名
3,鏈表

鏈表是一種常見的重要的數(shù)據(jù)結(jié)構(gòu)岛宦。它是動(dòng)態(tài)地進(jìn)行存儲(chǔ)分配的一種結(jié)構(gòu),鏈表中每一個(gè)元素稱為結(jié)點(diǎn)耍缴,每個(gè)結(jié)點(diǎn)都應(yīng)包括兩個(gè)部分:1砾肺,用戶需要用的實(shí)際數(shù)據(jù)挽霉;2,下一節(jié)點(diǎn)的地址变汪。鏈表中各元素在內(nèi)存中的地址可以不是連續(xù)的

struct Node{    //單鏈表
int date;  //數(shù)據(jù)域
Node *Next;  //指針域
}侠坎;
struct Node{  //雙鏈表
 int date;
 Node *next;  //后節(jié)點(diǎn)指針
 Node *previous//前節(jié)點(diǎn)指
 };

初始化頭結(jié)點(diǎn)

 //初始化頭結(jié)點(diǎn) 有返回值
Student *initHeader(){
//動(dòng)態(tài)分配內(nèi)存
Student *pTemp = malloc(1*sizeof(Student))
//初始化
pTemp->next = NULL;
return pTemp;
 }
 //無返回值
void *initHeader(Student **pHeader){
//動(dòng)態(tài)分配內(nèi)存
Student *pTemp = malloc(1*sizeof(Student));

//初始化
pTemp->next = NULL;
 //改變外部的值
*pHeader = pTemp;
 }
4,文件

打開文件 如果文件不存在 則創(chuàng)建一個(gè)新文件

  FILE *fp = fopen("C:/Users/asus/Desktop/abc.txt","w+")

文件的操作:
r 只讀 文件不存在就報(bào)錯(cuò) 從頭開始讀
w 只寫 文件不存在就創(chuàng)建 從頭開始寫 之前存在的內(nèi)容會(huì)被覆蓋
a 只寫 文件不存在就創(chuàng)建 從末尾開始寫
r+,w+,a+ 可讀可寫

struct Student{
        //內(nèi)存對(duì)齊
char name[10]; //優(yōu)化為占12個(gè)字節(jié) int的倍數(shù),浪費(fèi)2個(gè) 所以12+4=16
int age;

  };
Student xw1 = {"xw",20};
//將結(jié)構(gòu)體寫到文件
fwrite(&xw1,sizeof(Student),1,fp);

三裙盾、學(xué)習(xí)感悟

對(duì)于這次學(xué)習(xí)的內(nèi)容实胸,其他的還行,我感覺最難受的就是指針了指針這個(gè)概念比較復(fù)雜番官,使用也很靈活庐完,因此剛使用常會(huì)出錯(cuò),所以在使用時(shí)要十分小心徘熔,多思考门躯,多比較,多敲代碼酷师,在實(shí)踐中掌握它讶凉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市山孔,隨后出現(xiàn)的幾起案子懂讯,更是在濱河造成了極大的恐慌,老刑警劉巖饱须,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件域醇,死亡現(xiàn)場離奇詭異台谊,居然都是意外死亡蓉媳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門锅铅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酪呻,“玉大人,你說我怎么就攤上這事盐须⊥孳” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵贼邓,是天一觀的道長阶冈。 經(jīng)常有香客問我,道長塑径,這世上最難降的妖魔是什么女坑? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮统舀,結(jié)果婚禮上匆骗,老公的妹妹穿的比我還像新娘劳景。我一直安慰自己,他們只是感情好碉就,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布盟广。 她就那樣靜靜地躺著,像睡著了一般瓮钥。 火紅的嫁衣襯著肌膚如雪筋量。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天碉熄,我揣著相機(jī)與錄音毛甲,去河邊找鬼。 笑死具被,一個(gè)胖子當(dāng)著我的面吹牛玻募,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播一姿,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼七咧,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了叮叹?” 一聲冷哼從身側(cè)響起艾栋,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛉顽,沒想到半個(gè)月后蝗砾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡携冤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年悼粮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片曾棕。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扣猫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翘地,到底是詐尸還是另有隱情申尤,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布衙耕,位于F島的核電站昧穿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏橙喘。R本人自食惡果不足惜时鸵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渴杆。 院中可真熱鬧寥枝,春花似錦宪塔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至冠跷,卻和暖如春南誊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜜托。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工抄囚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橄务。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓幔托,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜂挪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子重挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容