C語言筆記--結構體
阿新 • • 發佈:2022-01-18
本文記錄了C語言struct和typedef一些結構體的知識:
結構體 struct
- 結構體所佔的空間,並不是簡單的裡面所包含的資料型別容量簡單相加,因為存在對齊策略,會比預期要大
struct MyStruct //結構體名 { }; //注意一定要加;
這是基本格式,其餘的見 筆記
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> struct student { int num; char name[20]; char sex; int age; float score; char daar[30]; }; //結構體型別宣告,注意最後一定要加分號 int main(){ struct student s={1001,"lele",'M',20,98.5,"Shenzhen"};//結構體變數 //列印要一個一個來 printf("%d %s %c %d %5.2f %s\n",s.num,s.name,s.sex,s.age,s.score,s.daar); system("pause"); return 0; }
結構體陣列
struct student sarr[3];//結構體陣列 int i; //通過scanf for迴圈讀取資料for (int i = 0; i < 3; i++) { //sarr[i].name 因為struct裡面char name[20];是字元陣列,所以開始是起始地址 //不需要&sarr[i].name scanf("%d %s %c %d %f %s\n",&sarr[i].num,sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,sarr[i].addr); } //列印輸出來 for (int i = 0; i < 3; i++) { printf("%d %s %c %d %f %s\n",sarr[i].num,sarr[i].name,sarr[i].sex,sarr[i].age,sarr[i].score,sarr[i].addr); }
結構體指標
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> struct student { int num; char name[20]; char sex; }; int main(){ struct student s={1001,"wangle",'M'};//結構體變數 也可以再結構體定義的最後寫 struct student* p;//結構體指標 p=&s; printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex); //()用括號的原因是.優先順序最高,p是指標,不能.name 只能->name 這樣會報錯 //也可與這樣寫 printf("%d %s %c\n",p->num,p->name,p->sex);//->用於指標的成員選擇 struct student sarr[3]={1001,"lilei",'M',1005,"zhangsan",'M',1007,"lili",'F'}; p=sarr;//p存的就是sarr陣列起始地址 int num=0; num=p->num++; printf("num=%d,p->num=%d\n",num,p->num); num=p++->num; printf("num=%d,p->num=%d\n",num,p->num); system("pause"); return 0; }
下面解釋下:
num=p->num++; printf("num=%d,p->num=%d\n",num,p->num); num=p++->num; printf("num=%d,p->num=%d\n",num,p->num);
num=p->num++; 跟i++很像
先num=p->num 結果為1001 ,然後 p->num++ p這時候為1002
num=p++->num;
->優先順序跟.一樣比 ++高
所以num=p->num 這時候p的地址上存的num 是上面的1002
再p++ 地址++ 變為下一個地址 指向1005
結構體typedef
typedef的作用就是起別名
定義方式:
typedf struct student { int num ; char name[20] ; char sex ; } stu , * pstu ;
-
stu
代表struct student
(給結構體型別起別名) -
* pstu
代表struct studen *
(給結構體指標變數起別名) -
typedef int INTEGER
起別名的作用在於程式碼即註釋,比如size_t 這樣可以快速知道作用
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> //給結構體型別起別名,叫stu,起了結構體指標型別的別名,叫pstu typedef struct student { int num; char name[20]; char sex; }stu,*pstu; //typedef _W64 unsigned int size_t; //size_t的定義 typedef int INEGER; //與size_t相似,起了個新型別INEGER int 型號 int main(){ stu s={1001,"wangle",'M'}; pstu p;//stu* p 就相當於一個結構體指標 INEGER i= 10; //等價與int i=10; p=&s;//p指向s的地址 printf("i=%d,p->num=%d\n",i,p->num); system("pause"); return 0; }
可以起別名,也可以直接當結構體使用