1. 程式人生 > 其它 >C語言筆記--結構體

C語言筆記--結構體

本文記錄了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;
}

可以起別名,也可以直接當結構體使用