C語言結構體指標詳解 - 程式人生

文章推薦指數: 80 %
投票人數:10人

比如指向struct STUDENT 型別的結構體變數,那麼指標變數就一定要定義成struct STUDENT* 型別。

下面將前面的程式用指標的方式修改一下:. # include >結構體指標,C語言結構體指標詳解 結構體指標,C語言結構體指標詳解 阿新••發佈:2018-12-06 結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。

指向結構體變數的指標 前面我們通過“結構體變數名.成員名”的方式引用結構體變數中的成員,除了這種方法之外還可以使用指標。

前面講過,&student1表示結構體變數student1的首地址,即student1第一個項的地址。

如果定義一個指標變數p指向這個地址的話,p就可以指向結構體變數student1中的任意一個成員。

那麼,這個指標變數定義成什麼型別呢?只能定義成結構體型別,且指向什麼結構體型別的結構體變數,就要定義成什麼樣的結構體型別。

比如指向structSTUDENT型別的結構體變數,那麼指標變數就一定要定義成structSTUDENT*型別。

下面將前面的程式用指標的方式修改一下: #include #include structAGE { intyear; intmonth; intday; }; structSTUDENT { charname[20];//姓名 intnum;//學號 structAGEbirthday;//生日 floatscore;//分數 }; intmain(void) { structSTUDENTstudent1;/*用structSTUDENT結構體型別定義結構體變數student1*/ structSTUDENT*p=NULL;/*定義一個指向structSTUDENT結構體型別的指標變數p*/ p=&student1;/*p指向結構體變數student1的首地址,即第一個成員的地址*/ strcpy((*p).name,"小明");//(*p).name等價於student1.name (*p).birthday.year=1989; (*p).birthday.month=3; (*p).birthday.day=29; (*p).num=1207041; (*p).score=100; printf("name:%s\n",(*p).name);//(*p).name不能寫成p printf("birthday:%d-%d-%d\n",(*p).birthday.year,(*p).birthday.month,(*p).birthday.day); printf("num:%d\n",(*p).num); printf("score:%.1f\n",(*p).score); return0; } 輸出結果是:name:小明birthday:1989-3-29num:1207041score:100.0我們看到,用指標引用結構體變數成員的方式是: (*指標變數名).成員名 注意,*p兩邊的括號不可省略,因為成員運算子“.”的優先順序高於指標運算子“*”,所以如果*p兩邊的括號省略的話,那麼*p.num就等價於*(p.num)了。

從該程式也可以看出:因為指標變數p指向的是結構體變數student1第一個成員的地址,即字元陣列name的首地址,所以p和(*p).name是等價的。

但是,“等價”僅僅是說它們表示的是同一個記憶體單元的地址,但它們的型別是不同的。

指標變數p是structSTUDENT*型的,而(*p).name是char*型的。

所以在strcpy中不能將(*p).name改成p。

用%s進行輸入或輸出時,輸入引數或輸出引數也只能寫成(*p).name而不能寫成p。

同樣,雖然&student1和student1.name表示的是同一個記憶體單元的地址,但它們的型別是不同的。

&student1是structSTUDENT*型的,而student1.name是char*型的,所以在對p進行初始化時,“p=&student1;”不能寫成“p=student1.name”。

因為p是structSTUDENT*型的,所以不能將char*型的student1.name賦給p。

此外為了使用的方便和直觀,用指標引用結構體變數成員的方式: (*指標變數名).成員名 可以直接用: 指標變數名->成員名 來代替,它們是等價的。

“->”是“指向結構體成員運算子”,它的優先順序同結構體成員運算子“.”一樣高。

p->num的含義是:指標變數p所指向的結構體變數中的num成員。

p->num最終代表的就是num這個成員中的內容。

下面再將程式用“->”修改一下: #include #include structAGE { intyear; intmonth; intday; }; structSTUDENT { charname[20];//姓名 intnum;//學號 structAGEbirthday;/*用structAGE結構體型別定義結構體變數birthday,生日*/ floatscore;//分數 }; intmain(void) { structSTUDENTstudent1;/*用structSTUDENT結構體型別定義結構體變數student1*/ structSTUDENT*p=NULL;/*定義structSTUDENT結構體型別的指標變數p*/ p=&student1;/*p指向結構體變數student1的首地址,即第一項的地址*/ strcpy(p->name,"小明"); p->birthday.year=1989; p->birthday.month=3; p->birthday.day=29; p->num=1207041; p->score=100; printf("name:%s\n",p->name);//p->name不能寫成p printf("birthday:%d-%d-%d\n",p->birthday.year,p->birthday.month,p->birthday.day); printf("num:%d\n",p->num); printf("score:%.1f\n",p->score); return0; }   資訊理論-資訊的度量 «上一篇 洛谷3809【模板】字尾排序——字尾陣列下一篇» 相關推薦 結構體指標,C語言結構體指標詳解 結構體指標,可細分為指向結構體變數的指標和指向結構體陣列的指標。

指向結構體變數的指標 前面我們通過“結構體變數名.成員名”的方式引用結構體變數中的成員,... 二叉樹的鏈式儲存結構及實現(C語言完整程式碼+詳細註釋) 鏈式儲存結構儲存二叉樹,實際上就是採用連結串列儲存二叉樹。

既然是使用連結串列,首先需要構建連結串列中節點的結構。

考慮到儲存物件為二叉樹,其各個節點最多包含... C語言正則表示式詳解 標準的C和C++都不支援正則表示式,但有一些函式庫可以輔助C/C++程式設計師完成這一功能,其中最著名的當數PhilipHazel的Perl-Compat... C語言專案的建立詳解 最近為方便記錄我的IT學習生活和相關經驗,於是將有關自己對對相關知識的見解置於CSDN部落格上,以供各位學習交流... C語言預處理命令詳解 本文參考諸多資料,詳細介紹常用的幾種預處理功能。

因成文較早,資料來源大多已不可考證,敬請諒解。

全文字數2萬,閱讀時間50分鐘,建議先收藏。

... C語言中volatile關鍵字詳解 volatile關鍵字詳解,以及在嵌入式中的應用 volatile關鍵字的作用是作為指令關鍵字,確保本條指令不會因為編譯器的... C語言位元組對齊詳解 一、什麼是對齊,以及為什麼要對齊: 1.現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可... C語言結構體與結構體指標用法總結 在C語言開發中,結構體用到的機會很多。

所謂結構體,就是定義一種裡面包含多種元素的變數。

我們來看一個簡單的例子。

比如你想定義... 【C語言】結構體包含指向自己的指標 執行環境:VC6.0 例子程式:tets.c ********************************************************... c語言結構體指標初始化 今天來討論一下C中的記憶體管理。

記得上週在飯桌上和同事討論C語言的崛起時,講到了記憶體管理方面 我說所有指標使用前都必須初... 搜尋 基礎教學 Mysql入門 Sql入門 Android入門 Docker入門 Go語言入門 Ruby程式入門 Python入門 Python進階 Django入門 Python爬蟲入門 最近訪問 結構體指標,C語言結構體指標詳解 HTTP請求錯誤400、401、402、403、404、405、406、407、412、414、50 malloc、calloc、realloc之間的區別 用VS2010開啟VS2012專案解決方案 KVM切換器經過廣大人民的勞動,已經可以多功能使用 基於.NetCore3.1系列+——+日誌記錄之日誌核心要素揭祕 作業4,版權保護 蒙特卡羅(Monte+Carlo)方法計算圓周率π LATEX教程(二) 關於Unity中粒子效果的使用



請為這篇文章評分?