1. 程式人生 > >結構體的初始化和引用及指向結構體變數的指標變數(C語言)

結構體的初始化和引用及指向結構體變數的指標變數(C語言)

一、首先我們來了解關於結構體以及結構體陣列的概念。

自定義結構體:

struct weapon{
    char name[20];
    int atk;
    int price;
};

它是"weapon"型(類似於我們熟知的int型,String型等),裡面有一個char型別,兩個int型別。

如何給這個結構體賦值以及訪問裡面的屬性?

    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s\n,%d\n",weapon_1.name,++weapon_1.price);

"weapon weapon_1"表示我們例項化了weapon型別的一個具體的物件,我們給它起名為“weapon_1”(型別於int a),並且我們給“weapon_1”賦了三個值{"weapon_name",100,200},這三個值分別對應結構體裡的char name[20],int atk,int price。

完整程式碼如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s\n,%d\n",weapon_1.name,++weapon_1.price);
    return 0;
}

執行結果:

什麼是結構體陣列?

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

struct weapon weapon_2[2]中[2]表示這個陣列的大小是2。

完整程式碼如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s %d\n",weapon_2[0].name,weapon_2[1].atk);

    return 0;
}

執行結果:

 二、指向結構體變數的指標變數

 先上程式碼:

    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon * w;
    w = &weapon_1;
    printf("name = %s  name = %s\n",(*w).name,w->name);//w->name weapon_1.name

首先我們先定義一個指向weapon型別的指標變數w,然後讓w指向weapon_1,現在我們可以通過指向結構體變數的指標w去訪問weapon_1。

值得注意的是(*w).name可簡寫成w->name,它們都表示weapon_1.name。

完整程式碼如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_1 = {"weapon_name",100,200};
    printf("%s %d\n",weapon_1.name,++weapon_1.price);

    struct weapon * w;
    w = &weapon_1;
    printf("name = %s  name = %s\n",(*w).name,w->name);//w->name weapon_1.name

    return 0;
}

執行結果:

那麼結構體陣列呢?

    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

    struct weapon * p;
    p = weapon_2;//p->name weapon_2[0].name
    printf("%s\n",p->name);
    p++;//weapon_2 +1 weapon_2[1]
    printf("%s\n",p->name);

可以注意到,“p = weapon_2”中不加“&”。“p = weapon_2”此時表示的是指標p指向的是weapon_2陣列第一個元素的起始地址。

如果我們輸出p->name,實際它表示的是weapon_2[0].name。

如果想訪問weapon_2陣列中第二個元素的name成員,應該如何操作?

我們可以將p進行一個 ++的操作,則可以訪問weapon_2[1].name。

完整程式碼如下:

#include<stdio.h>
struct weapon{
    char name[20];
    int atk;
    int price;
};

int main()
{
    struct weapon weapon_2[2] = {{"weapon_name1",50,100},{"weapon_name2",100,200}};
    printf("%s  %d\n",weapon_2[0].name,weapon_2[1].atk);

    struct weapon * p;
    p = weapon_2;//p->name weapon_2[0].name
    printf("%s\n",p->name);
    p++;//weapon_2 +1 weapon_2[1]
    printf("%s\n",p->name);

    return 0;
}

執行結果: