標籤:style blog http java color 使用
C 結構體小結
關於結構體的聲明:
# include <stdio.h>//第一種方式struct Student{ int age; float score; char sex;};//第二種方式struct Student2{ int age; float score; char sex;} st2;//第三種方式struct { int age; float score; char sex;} st3;int main(void){ struct Student st = {80, 66.6, ‘F‘}; return 0;}
結構體變數的賦值和初始化:
1.
# include <stdio.h>//第一種方式struct Student{ int age; float score; char sex;};int main(void){ struct Student st = {80, 66.6, ‘F‘}; //初始化 定義的同時賦初值 struct Student st2; st2.age = 10; st2.score = 88; st2.sex = ‘F‘; printf("%d %f %c\n", st.age, st.score, st.sex); printf("%d %f %c\n", st2.age, st2.score, st2.sex); return 0;}
2.
# include <stdio.h>//第一種方式struct Student{ int age; float score; char sex;};int main(void){ struct Student st = {80, 66.6F, ‘F‘}; //初始化 定義的同時賦初值 struct Student * pst = &st; //&st不能改成st pst->age = 88;//第二種方式 st.score = 66.6f; //第一種方式 66.6在C語言中預設是double類型,如果希望一個實數是float類型,則必須在末尾加f或F, 因此66.6是double, 66.6f或66.6F是float printf("%d %f\n", st.age, pst->score); return 0;}
引用 : http://www.cnblogs.com/ligongzi/archive/2012/08/24/2654448.html
struct Student{ char name[20]; char sex; int age; char addr[40];};/*然後定義一個Student 類型的 student變數*/struct Student student;
也許是我受了Java影響,我一度寫成這樣:
struct man{ int age = 30; int score = 80;};int main(){ man man1 = {20,70};}
結果是鐵定編譯通過不了的。因為這是我自創的聲明帶預設值的結構體,編譯器沒見過。
結構體成員變數在聲明中是不能賦值的。
正確的寫法是:
struct Man{ int age; //這樣就好了 int score;};int main(){ struct Man man1 = {30,80};}
定義結構體的時候每次都要寫struct 顯然是煩瑣了,
精鍊的C語言用來typedef來方便定義使用:
typedef struct Man{ int age; int score;}man;int main(){ man man1 = {20,80}; man man2 = {30,70}; man man3 = {40,99}; printf("%d\n",man1.age); printf("%d\n",man3.score);}
這樣一來大家想召喚多少個“男人”都沒有問題。另外有一個極端一點的問題,聲明結構體名和定義結構體變數名能不能一樣?我們可以試試看:
typedef struct man{ int age; int score;}man; //還叫man,有意見嗎?int main(){ man man = {40,50};//還叫man,有問題嗎? printf("%d\t%d\n",man.age,man.score);}
編譯運行都是沒有問題的。不信自己去試試看。
然後我們來討論重點吧:
struct Student{ char name[20]; char sex; int age; char addr[40];};/*然後定義一個Student 類型的 student變數*/struct Student student;
給定義的結構中name和age賦值, 可以用下面語句:
strcpy(student->name, "jack"); student->age=21; student->name就是(*student).name的縮寫形式。
需要指出的是結構指標是指向結構的一個指標, 是結構中第一個成員的首地址, 因此在使用之前應該對結構指標初始化, 即分配整個結構長度的位元組空間, 這可用下面函數完成, 仍以上例來說明如下:
student=(struct string*)malloc(size of (struct string));
size of (struct string)自動求取string結構的位元組長度, malloc() 函數定義了一個大小為結構長度的記憶體地區, 然後將其詐地址作為結構指標返回。
注意:
結構變數名不是指向該結構的地址, 這與數組名的含義不同, 因此若需要求結構中第一個成員的首地址應該是&[結構變數名]。
demo.
/* 2009年11月24日9:17:43 樣本: 發送地址還是發送內容 目的: 指標的優點之一: 快速的傳遞資料, 耗用記憶體小 執行速度快*/# include <stdio.h># include <string.h>struct Student{ int age; char sex; char name[100];}; //分號不能省void InputStudent(struct Student *);void OutputStudent(struct Student *);int main(void){ struct Student st ; //15行 //printf("%d\n", sizeof(st)); InputStudent(&st); //對結構體變數輸入 必鬚髮送st的地址 OutputStudent(&st); //對結構體變數輸出 可以發送st的地址也可以直接發送st的內容 但為了減少記憶體的耗費,也為了提高執行速度,推薦發送地址 return 0;}void OutputStudent(struct Student *pst){ printf("%d %c %s\n", pst->age, pst->sex, pst->name);}void InputStudent(struct Student * pstu) //pstu只佔4個位元組{ (*pstu).age = 10; strcpy(pstu->name, "張三"); pstu->sex = ‘F‘; }/*//本函數無法修改主函數15行st的值 所以本函數是錯誤的void InputStudent(struct Student stu){ stu.age = 10; strcpy(stu.name, "張三"); //不能寫成 stu.name = "張三"; stu.sex = ‘F‘;}*/