結構 struct 是把相關聯,又可能不同的資料型態結合成一種新的資料型態。
例如:
一個人相關的資料有姓名(char [])、年齡(int)。
這些相關資料各有不同資料型態 (字元陣列、整數)。
如果沒有使用結構把資料結合成一筆資料,那麼要記錄一個人的資料就要如下方式:

char name[11]; //姓名最長英文10個字含結尾"\0"(中文字5個字)
int age; //年齡

輸入操作方式如下:
scanf("%s",name);//輸入姓名字串
scanf("%d",age);//輸入年齡

輸出操作方式如下:
printf("%s",name);//輸出姓名字串
printf("%d",age);//輸出入年齡

若改成 struct 結構,則
struct student{
    char name[11];//姓名最長英文10個字含結尾"\0"(中文字5個字)
    int age;//年齡
};

main(){
struct student a; //學生 a 的資料

//輸入操作方式如下:
scanf("%s",a.name);//輸入學生 a 的姓名字串
scanf("%d",a.age);//輸入學生 a 的年齡
//輸出操作方式如下:
printf("%s",a.name);//輸出學生 a 的姓名字串
printf("%d",a.age);//輸出學生 a 的年齡

struct 定義方式:
struct 結構名稱{
    資料型態 結構成員名稱1;
    資料型態 結構成員名稱2;
    ..................
    資料型態 結構成員名稱n;
}變數名1,變數名1,...,變數名n;
//變數宣告為 struct 者可以在此宣告

範例:
struct complex{
int x;
int y;
}a,b;


typedef struct 結構名稱 另一個結構名稱;

struct 結構名稱{
    資料型態 結構成員名稱1;
    資料型態 結構成員名稱2;
    ..................
    資料型態 結構成員名稱n;
}變數名1,變數名1,...,變數名n;

範例:
typedef struct complex Complex;

struct complex{
int x;
int y;
}a,b;
 

typedef struct 結構名稱{
    資料型態 結構成員名稱1;
    資料型態 結構成員名稱2;
    ..................
    資料型態 結構成員名稱n;
}另一個結構名稱;

範例:
typedef struct complex{
int x;
int y;
}Complex;
struct 宣告方式:
struct complex c;
 
struct complex c;
Complex d;
 
struct complex c;
Complex d;
struct 使用方式:
a.x=2;
b.y=3;
c.x=7;
a.x=2;
b.y=3;
c.x=7;
d.y=-10;
c.x=1;
d.y=-6;

struct 可以個別設定每一個變數所佔位元數,如下範例:
typedef struct bitset{
    int w:2;
    int x:3;
    unsigned int y:1;
    unsigned int z:2;
}Bitset;

這個 Bitset 結構,定義了 4 種資料,
w 佔用 0 - 1 (2 bits) 以 int 方式處理,範圍 -2 至 1。
x 佔用 2 - 4 (3 bits) 以 int 方式處理,範圍 -4 至 3。
y 佔用 5 (1 bits) 以 unsigned int 方式處理,範圍 0 至 1。
z 佔用 6 - 7 (3 bits) 以 unsigned int 方式處理,範圍 0 至 3。

下面程式可以結合 union 觀察變數範圍:

#include <stdio.h>
#include <stdlib.h>

typedef struct bitset{
    int w:2;
    int x:3;
    unsigned int y:1;
    unsigned int z:2;
}

Bitset;union uniSet{
    char p;
    Bitset k;
}a;

int main(int argc, char *argv[]) {
    int i;
    printf("i \ta.k.z \ta.k.y \ta.k.x \ta.k.w\n");
    printf("---------------------------------------------------------------\n");
    for(i=0;i<256;i++){
        a.p=(char)i;
        printf("i=%-d\ta.k.z=%-4d\ta.k.y=%-4d\ta.k.x=%-4d\ta.k.w=%-4d\n", i, a.k.z, a.k.y, a.k.x, a.k.w);
    }
}